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

QtDesigner changes will be lost after redesign User Interface

提问人:Ahad aghapour 提问时间:10/3/2017 最后编辑:eyllanescAhad aghapour 更新时间:8/30/2020 访问量:6286

问:

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

我该如何解决这个问题?

我们可以在 python 中将一个类分布在多个文件上以在其他文件中编写代码吗?

python pyqt pyqt5 qt-designer

评论

0赞 ekhumoro 10/3/2017
请参阅 PyQt5 文档中的使用 Qt Designer,了解如何使用 pyuic 生成的代码。

答:

15赞 eyllanesc 10/3/2017 #1

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

例如,假设您使用了文件中的模板,然后将其转换为以下结构:MainWindowdesign.uiUi_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()

评论

0赞 ghost21blade 1/8/2022
什么是QMainWindow?从哪里进口
1赞 eyllanesc 1/9/2022
1. doc.qt.io/qt-5/qmainwindow.html 2.from PyQt5.QtWidgets import QMainWindow
7赞 Ahad aghapour 1/24/2018 #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_())