重新设计用户界面后,QtDesigner 更改将丢失

Posted

技术标签:

【中文标题】重新设计用户界面后,QtDesigner 更改将丢失【英文标题】:QtDesigner changes will be lost after redesign User Interface 【发布时间】:2017-10-03 12:37:29 【问题描述】:

我正在使用 Qt Designer 设计 GUI 以在 python 中使用,在 Qt Designer 中设计我想要的 UI 后,将其转换为 python 代码,然后我更改生成的代码以在我的 python 代码中执行一些操作,但如果我改变了使用 Qt Designer 的 UI 并将其再次转换为 python 代码,我丢失了我之前对代码所做的更改。

我该如何解决这个问题?

我们可以在 python 中将一个类传播到多个文件中以在其他文件中编写代码吗?

【问题讨论】:

请参阅 PyQt5 文档中的 Using Qt Designer,了解如何使用 pyuic 生成的代码的示例。 【参考方案1】:

为避免出现这些问题,建议不要修改此文件,而是创建一个新文件,在其中我们实现一个使用该设计的类。

例如,假设您在design.ui文件中使用了MainWindow模板,然后将其转换为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:出现在您的设计中的类的名称。

这种实现的好处是你可以实现所有的逻辑,因为它是一个小部件,例如我们将实现解决方案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()

【讨论】:

什么是 QMainWindow ?从哪里进口 1. doc.qt.io/qt-5/qmainwindow.html 2. from PyQt5.QtWidgets import QMainWindow【参考方案2】:

最简单的方法是直接在python代码中使用*.ui文件,不需要每次修改ui都转换成*.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_())

【讨论】:

以上是关于重新设计用户界面后,QtDesigner 更改将丢失的主要内容,如果未能解决你的问题,请参考以下文章

如何在 QT 设计器中重新绘制小部件

python3 PyQt5 运行后界面控件缩在左上角,但在QTdesigner里面预览是正常的?

QtDesigner - 两个具有不同大小的相同组合框

设计工具- QtDesigner

使用 pyqt4 在设计的 qtdesigner ui 中添加树视图

Qt Designer的使用