gpt4 book ai didi

python - 为什么 Qt Designer 会在 PyQt5 中创建额外的不必要的浪费代码?

转载 作者:行者123 更新时间:2023-12-04 09:54:07 24 4
gpt4 key购买 nike

我创建了一个简单的表单(没有任何功能),其中包括 2 个小部件(一个按钮和一个 LineEdit),首先通过手动编码,然后使用 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 创建的文件是怎么回事吗?
    在我看来,它只为 UI 创建了一个单独的类,然后创建了 QMainWindow 的实例。类,然后在 Ui_MainWindow() 中修改此实例创建的实例。
    但是在我的代码中,我直接创建了一个继承自 QMainWindow 的 MainWindow 类,然后在该类中设置 UI
  • 还有什么是通过我们的QMainWindow实例在这里??: self.centralwidget = QtWidgets.QWidget(MainWindow)为什么不 self.centralwidget = QtWidgets.QWidget() ?
  • 这些额外的代码有什么意义?!
  • 最佳答案

  • 在 Qt/C++ 中,uic 是一个工具,它允许您将 .ui 转换为 C++ 代码作为用于填充某些小部件的接口(interface),同样的概念是 pyuic 试图做的,但在 python 中。在您的情况下,填写 QMainWindow 或从它派生的类。但是如果直接实现继承,那么它将仅限于我最初考虑的功能,例如,它不能被从 QMainWidow 继承的类使用。总结:pyuic 模仿 uic 所做的事情,而 uic 旨在创建一个填充一些 Qt Widget 的接口(interface)。
  • 两种形式都是等效且有效的,因此没有更好的方法(完全值得商榷)
  • 继(1)uic增加了更多的东西来通过MOC处理QObjects,比如objectName(),它还实现了一个模板供你做翻译(你的应用程序可以用不同的语言显示),除了使用QMetaObject::connectSlotsByName() 允许自动连接。

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

    关于python - 为什么 Qt Designer 会在 PyQt5 中创建额外的不必要的浪费代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61962090/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com