为什么Qt Designer在PyQt5中会产生额外的不必要的废代码?

问题描述 投票:1回答:1

我创建了一个简单的表单(没有任何功能),其中包括2个小部件(一个按钮和一个LineEdit),首先通过手动编码,然后使用Qt Designer。我不明白为什么Qt Designer要创建这么多额外的代码,而这些代码看起来毫无用处(对我来说),并且让它变得如此复杂!这是我手动编写的代码,而这是Qt Designer的输出。

import sys

from PyQt5.QtWidgets import QMainWindow,QPushButton,QApplication, QLineEdit

class Example(QMainWindow):
        def __init__(self):
            super().__init__()
            self.initUI()
        def initUI(self):

            btn1 = QPushButton('Button1', self)
            btn1.move(30,50)
            btn1.resize(btn1.sizeHint())
            le = QLineEdit(self)
            le.move(100,100)
            self.setGeometry(300,300,290,150)
            self.setWindowTitle('Event Sender')
            self.show()

app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())

这是Qt Designer UI文件的输出(作为一个python文件)。

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(417, 297)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(60, 130, 75, 23))
        self.pushButton.setObjectName("pushButton")
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setGeometry(QtCore.QRect(210, 180, 113, 20))
        self.lineEdit.setObjectName("lineEdit")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 417, 20))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Event Sender"))
        self.pushButton.setText(_translate("MainWindow", "Button1"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

下面是我的问题。

  1. 有人能给我解释一下Qt Designer创建的文件是怎么回事吗?QMainWindow 类中修改这个实例,然后在 Ui_MainWindow() 但在我的代码中,我直接创建了一个继承自QMainWindow的MainWindow类,然后在该类中设置了UI。

  2. 另外,我们通过我们的 QMainWindow 这里的例子吗?self.centralwidget = QtWidgets.QWidget(MainWindow) 为什么不呢?self.centralwidget = QtWidgets.QWidget()?

  3. 这些额外的代码有什么用?

python pyqt pyqt5 qt-designer
1个回答
2
投票
  1. 在QtC++中,uic是一个工具,它允许你将一个.ui转换为C++代码,作为一个用于填充一些widget的接口,同样的概念是pyuic试图做的,但在python中。在你的情况下,填入一个QMainWindow或由它派生的类。但如果直接实现继承,那么它的功能就会被限制在我最初想到的功能上,因为,例如,它不能被一个从QMainWidow继承的类使用。总结:pyuic模仿了uic所做的事情,而uic的目的是创建一个接口,填充一些Qt Widget。

  2. 两种形式都是等价的、有效的,所以没有更好的方式(这一点完全可以商榷一下

  3. 继(1)之后,uic增加了更多通过MOC处理QObjects的东西,比如objectName(),它还实现了一个模板让你做翻译(你的应用程序可以用不同的语言显示),此外还使用QMetaObject::connectSlotsByName()允许自动连接。

如果你要使用pyuic,那么就不要关注这些代码,因为你不需要修改它,如果你认为它是不必要的代码,那么就不要使用它。像任何工具一样,你有它的优点和缺点。如果你认为它的实现可以改进,那么你可以建立自己的工具,读取.ui(这是一个XML),并根据这些信息实现代码生成。

© www.soinside.com 2019 - 2024. All rights reserved.