python pyqt pyqt5 qt-designer

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



pyqt pyqt5 (2)

Estoy usando QtDesinger para el diseño de la GUI para usar en Python, después de diseñar mi interfaz de usuario deseada en QtDesigner, convertirlo a código de Python y luego cambié el código generado para hacer alguna acción en mi código de Python, pero si cambié la interfaz de usuario con QtDesigner y convertirlo a código python nuevamente, perdí mis cambios anteriores en mi código.

¿Cómo puedo resolver el problema?

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


La forma más fácil es usar el archivo * .ui directamente en el código de Python, no es necesario convertirlo a * .py cada vez que cambie la interfaz de usuario. Puedes usar este pseudocó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_())


Para evitar tener estos problemas, es aconsejable 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 al que llamaremos logic.py donde crearemos el archivo que maneja la lógica y que utiliza 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

  • 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()