Изменения QtDesigner будут потеряны после редизайна пользовательского интерфейса


Я использую QtDesinger для графического дизайна для использования в Python, после разработки нужного интерфейса в QtDesigner, преобразовать его в Python код, и тогда я изменил код, созданный, чтобы делать какие-то действия в мой код на Python, но если я изменил интерфейс с QtDesigner и преобразовать его в Python-код еще раз, я потерял предыдущие изменения в мой код.

Как я могу решить эту проблему?

Можем ли мы распределить класс по нескольким файлам в python для записи кода в другие файлы?

2 2

2 ответа:

Чтобы избежать этих проблем, рекомендуется не изменять этот файл, а создать новый файл, в котором мы реализуем класс, использующий этот дизайн.

Например, предположим, что вы использовали шаблон MainWindow в файле design.ui, а затем преобразуете его в Ui_Design.py, например, в следующую структуру:

from PyQt5 import QtCore, QtGui, QtWidgets

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

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

Затем мы создадим новый файл, который мы будем называть logic.py, где мы создадим файл, который обрабатывает логику и использует предыдущий дизайн:

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

Так что даже если вы измените дизайн и генерировать файл снова. py вам не придется изменять файл логики.

Чтобы обобщить идею, мы должны иметь следующие правила, но для этого класс логики должен иметь следующую структуру:

class Logic(PyQtClass, DesignClass):
    def __init__(self, *args, **kwargs):
        PyQtClass.__init__(self, *args, **kwargs)
        self.setupUi(self)
  • PyQtClass: этот класс зависит от выбранного дизайна.

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

  • DesignClass: имя класса, который появляется в вашем дизайне.

Преимущество этой реализации заключается в том, что вы можете реализовать все логика так как это виджет, например мы реализуем решение закрывающее pyqt messageBox с closeevent родительского окна :

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

Самый простой способ-использовать *.файл пользовательского интерфейса непосредственно в коде python, вам не нужно конвертировать в файл *.py каждый раз, когда вы изменяете пользовательский интерфейс. вы можете использовать этот псевдокод в своем проекте.

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