我创建了一个简单的表单(没有任何功能),其中包括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_())
下面是我的问题。
有人能给我解释一下Qt Designer创建的文件是怎么回事吗?QMainWindow
类中修改这个实例,然后在 Ui_MainWindow()
但在我的代码中,我直接创建了一个继承自QMainWindow的MainWindow类,然后在该类中设置了UI。
另外,我们通过我们的 QMainWindow
这里的例子吗?self.centralwidget = QtWidgets.QWidget(MainWindow)
为什么不呢?self.centralwidget = QtWidgets.QWidget()
?
这些额外的代码有什么用?
在QtC++中,uic是一个工具,它允许你将一个.ui转换为C++代码,作为一个用于填充一些widget的接口,同样的概念是pyuic试图做的,但在python中。在你的情况下,填入一个QMainWindow或由它派生的类。但如果直接实现继承,那么它的功能就会被限制在我最初想到的功能上,因为,例如,它不能被一个从QMainWidow继承的类使用。总结:pyuic模仿了uic所做的事情,而uic的目的是创建一个接口,填充一些Qt Widget。
两种形式都是等价的、有效的,所以没有更好的方式(这一点完全可以商榷一下
继(1)之后,uic增加了更多通过MOC处理QObjects的东西,比如objectName(),它还实现了一个模板让你做翻译(你的应用程序可以用不同的语言显示),此外还使用QMetaObject::connectSlotsByName()允许自动连接。
如果你要使用pyuic,那么就不要关注这些代码,因为你不需要修改它,如果你认为它是不必要的代码,那么就不要使用它。像任何工具一样,你有它的优点和缺点。如果你认为它的实现可以改进,那么你可以建立自己的工具,读取.ui(这是一个XML),并根据这些信息实现代码生成。