为啥窗口/对话框不是 PyQt 创建的类的一部分?

Posted

技术标签:

【中文标题】为啥窗口/对话框不是 PyQt 创建的类的一部分?【英文标题】:Why are windows/dialogs not part of the class PyQt creates?为什么窗口/对话框不是 PyQt 创建的类的一部分? 【发布时间】:2013-05-12 04:50:54 【问题描述】:

我对 Qt 还很陌生。我用自省和 Glade UI 设计器在 Gtk3 中构建了一些东西。

现在,我正在尝试学习 PyQt。虽然我喜欢它如何让你的 Ui 成为一个类(对我来说似乎更容易管理),但有些事情让我感到困惑。当我使用-x(创建可执行文件)标志运行pyuic4 时,它有这段代码:

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s

class Ui_multippp(object):
    def setupUi(self, multippp):
        multippp.setObjectName(_fromUtf8("multippp"))
        multippp.resize(371, 43)
        self.verticalLayout = QtGui.QVBoxLayout(multippp)
        self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
        self.label = QtGui.QLabel(multippp)
        self.label.setObjectName(_fromUtf8("label"))
        self.verticalLayout.addWidget(self.label)
        self.verticalLayout_2 = QtGui.QVBoxLayout()
        self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2"))
        self.verticalLayout.addLayout(self.verticalLayout_2)

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

    def retranslateUi(self, multippp):
        multippp.setWindowTitle(QtGui.QApplication.translate("multippp", "Multiple PPP Accounts", None, QtGui.QApplication.UnicodeUTF8))
        self.label.setText(QtGui.QApplication.translate("multippp", "More than one PPP account found, please select one:", None, QtGui.QApplication.UnicodeUTF8))


if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    multippp = QtGui.QDialog()
    ui = Ui_multippp()
    ui.setupUi(multippp)
    multippp.show()
    sys.exit(app.exec_())

我在这个(生成的)代码中试图理解的是为什么 multippp 对话框不是所有其他小部件的类的一部分。相反,据我所知,你给它一个 QDialog,它会将它雕刻成你想要的样子。将 QDialog 分开有什么好处,如果有,有什么好处?

【问题讨论】:

我认为它只是试图模仿 C++ 接口。 @icktoofay C++ 接口这样做是有原因的吗? (我知道一些 C++,但不是很多,所以也许我遗漏了一些明显的东西?) 嗯,通常您将拥有自己编写的代码和自动生成的 UI 代码。显然,Qt 不想编辑你的代码来拼接它的小部件引用,所以他们只是生成了另一个类。我猜他们仍然希望 your 代码成为扩展小部件的代码,因此您可以覆盖小部件的方法或其他东西。这些约束有点强迫它成为一个单独的类,包含对小部件的所有引用,但它本身不能是小部件。 【参考方案1】:

子小部件需要像 QMainWindow 或 QDialog 这样的小部件容器。但是,您也可以将小部件用作***小部件。 QDialog 存在是因为 pyuic4 不知道您打算如何使用这个设计的小部件。

在您的程序中,QDialog 可以是任何其他小部件容器。你也可以继承multippp。

最后,QDialog 只是执行代码的父级。

【讨论】:

以上是关于为啥窗口/对话框不是 PyQt 创建的类的一部分?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 pyqt5 和 qt 设计器从主对话框窗口打开第二个窗口

PyQt5快速入门PyQt5基本窗口组件

PyQt - 如何在不关闭对话框窗口的情况下停止执行

为啥继承另一个类的类不会产生与“另一个类”相同的结果?

《PyQT5软件开发 - 基础篇》第6章 PyQt5对话框

《PyQT5软件开发 - 基础篇》第6章 PyQt5对话框