QtDesigner changes will be lost after redesign User Interface

筅森魡賤 提交于 2020-03-06 09:49:53

问题


I'm using QtDesinger for design GUI to use in python, after designing my desired UI in QtDesigner, convert it to python code and then I changed generated code to do some action in my python code, but if I changed the UI with QtDesigner and convert it to python code again, I lost my previous changes on my code.

how can I solve the problem?

can we Spreading a Class Over Multiple Files in python to write code in other files?


回答1:


To avoid having these problems it is advisable not to modify this file but to create a new file where we implement a class that uses that design.

For example, suppose you have used the MainWindow template in the design.ui file, then convert it to Ui_Design.py like to the following structure:

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        [...]

    def retranslateUi(self, MainWindow):
        [...]

Then we will create a new file that we will call logic.py where we will create the file that handles the logic and that uses the previous design:

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

So even if you modify the design and generate the file again .py you will not have to modify the file of the logic.

To generalize the idea we must have the following rules but for this the logic class must have the following structure:

class Logic(PyQtClass, DesignClass):
    def __init__(self, *args, **kwargs):
        PyQtClass.__init__(self, *args, **kwargs)
        self.setupUi(self)
  • PyQtClass: This class depends on the design chosen.

   Template                      PyQtClass
 ─────────────────────────────────────────────
   Main Window                   QMainWindow
   Widget                        QWidget 
   Dialog with Buttons Bottom    QDialog
   Dialog with Buttons Right     QDialog
   Dialog with Without Buttons   QDialog

  • DesignClass: The name of the class that appears in your design.

The advantage of this implementation is that you can implement all the logic since it is a widget, for example we will implement the solution closing pyqt messageBox with closeevent of the parent window :

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



回答2:


The easiest way is to use the *.ui file directly in the python code, you don't need convert to *.py file every time you change the ui. you can use this pseudo code in your project.

# 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_())


来源:https://stackoverflow.com/questions/60217596/trying-to-override-close-event-with-code-created-by-designer-for-pyqt

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!