Los cambios de QtDesigner se perderán después de rediseñar la interfaz de usuario

Estoy usando QtDesinger para el diseño de la GUI para usar en python, después de diseñar mi IU deseada en QtDesigner, convertirlo en código de python y luego cambié el código generado para hacer algo en mi código de python, pero si cambié la IU con QtDesigner y convertirlo al código de Python otra vez, perdí mis cambios anteriores en mi código.

¿Cómo puedo solucionar el problema?

¿Podemos distribuir una clase sobre varios archivos en python para escribir código en otros archivos?

Para evitar tener estos problemas, es recomendable no modificar este archivo, sino crear un nuevo archivo donde implementemos una clase que use ese diseño.

Por ejemplo, suponga que ha utilizado la plantilla MainWindow en el archivo design.ui , luego Ui_Design.py a Ui_Design.py como a la siguiente estructura:

 from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): [...] def retranslateUi(self, MainWindow): [...] 

Luego, crearemos un nuevo archivo que llamaremos logic.py donde crearemos el archivo que maneje la lógica y que use el diseño anterior:

 class Logic(QMainWindow, Ui_MainWindow): def __init__(self, *args, **kwargs): QMainWindow.__init__(self, *args, **kwargs) self.setupUi(self) 

Entonces, incluso si modifica el diseño y genera el archivo nuevamente .py, no tendrá que modificar el archivo de la lógica.

Para generalizar la idea debemos tener las siguientes reglas, pero para esto la clase lógica debe tener la siguiente estructura:

 class Logic(PyQtClass, DesignClass): def __init__(self, *args, **kwargs): PyQtClass.__init__(self, *args, **kwargs) self.setupUi(self) 
  • PyQtClass: esta clase depende del diseño elegido.
Template PyQtClass ───────────────────────────────────────────── Main Window QMainWindow Widget QWidget Dialog with Buttons Bottom QDialog Dialog with Buttons Right QDialog Dialog with Without Buttons QDialog
Template PyQtClass ───────────────────────────────────────────── Main Window QMainWindow Widget QWidget Dialog with Buttons Bottom QDialog Dialog with Buttons Right QDialog Dialog with Without Buttons QDialog 
  • DesignClass: el nombre de la clase que aparece en su diseño.

La ventaja de esta implementación es que puede implementar toda la lógica ya que es un widget, por ejemplo, implementaremos la solución cerrando pyqt messageBox con closeevent de la ventana principal :

 class Logic(QMainWindow, Ui_MainWindow): def __init__(self, *args, **kwargs): QMainWindow.__init__(self, *args, **kwargs) self.setupUi(self) def closeEvent(self, event): answer = QtWidgets.QMessageBox.question( self, 'Are you sure you want to quit ?', 'Task is in progress !', QtWidgets.QMessageBox.Yes, QtWidgets.QMessageBox.No) if answer == QtWidgets.QMessageBox.Yes: event.accept() else: event.ignore() 

La forma más fácil es usar el archivo * .ui directamente en el código de Python, no es necesario convertirlo al archivo * .py cada vez que cambie la interfaz de usuario. Puedes usar este pseudo código en tu proyecto.

 # imports from PyQt5 import uic # load ui file baseUIClass, baseUIWidget = uic.loadUiType("MainGui.ui") # use loaded ui file in the logic class class Logic(baseUIWidget, baseUIClass): def __init__(self, parent=None): super(Logic, self).__init__(parent) self.setupUi(self) . . . . def main(): app = QtWidgets.QApplication(sys.argv) ui = Logic(None) ui.showMaximized() sys.exit(app.exec_())