Изменения QtDesigner будут потеряны после редизайна пользовательского интерфейса
Я использую QtDesinger для графического дизайна для использования в Python, после разработки нужного интерфейса в QtDesigner, преобразовать его в Python код, и тогда я изменил код, созданный, чтобы делать какие-то действия в мой код на Python, но если я изменил интерфейс с QtDesigner и преобразовать его в Python-код еще раз, я потерял предыдущие изменения в мой код.
Как я могу решить эту проблему?
Можем ли мы распределить класс по нескольким файлам в python для записи кода в другие файлы?
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_())