自定义外部小部件不显示

Custom External Widget does not show up

我想为我编写的 python 文件创建一个 GUI,所以我下载了 PyQt5 和 Qt Designer。当我第一次尝试导出 Qt Designer 项目时,我意识到使用的不是 PyQt5,而是 PySide2。这是什么原因?

到那时一切正常,我想开始一些具体的事情,比如将我创建的小部件放入 scrollArea。为此,我创建了一个自定义小部件并创建了一个 .ui 和一个 .py。但如果我试图给他们打电话,他们就不会出现。 python 的生成代码也如下所示:

from PySide2.QtCore import (QCoreApplication, QMetaObject, QObject, QPoint, QRect, QSize, QUrl, Qt)

from PySide2.QtGui import (QBrush, QColor, QConicalGradient, QCursor, QFont, QFontDatabase, QIcon, QLinearGradient, QPalette, QPainter, QPixmap, QRadialGradient)

from PySide2.QtWidgets import *


class Ui_Form(object):
    def setupUi(self, Form):
    if Form.objectName():
        Form.setObjectName(u"Form")
    Form.resize(640, 480)
    self.widget = QWidget(Form)
    self.widget.setObjectName(u"widget")
    self.widget.setGeometry(QRect(270, 190, 77, 44))
    self.verticalLayout = QVBoxLayout(self.widget)
    self.verticalLayout.setObjectName(u"verticalLayout")
    self.verticalLayout.setContentsMargins(0, 0, 0, 0)
    self.label = QLabel(self.widget)
    self.label.setObjectName(u"label")

    self.verticalLayout.addWidget(self.label)

    self.pushButton = QPushButton(self.widget)
    self.pushButton.setObjectName(u"pushButton")

    self.verticalLayout.addWidget(self.pushButton)


    self.retranslateUi(Form)

    QMetaObject.connectSlotsByName(Form)
# setupUi

def retranslateUi(self, Form):
    Form.setWindowTitle(QCoreApplication.translate("Form", u"Form", None))
    self.label.setText(QCoreApplication.translate("Form", u"TextLabel", None))
    self.pushButton.setText(QCoreApplication.translate("Form", u"PushButton", None))
# retranslateUi

如您所见,我的小部件不是从“QWidget”继承的,而是从“对象”继承的。另外,我的小部件没有“init”,而是一个“setupUi”。 这是为什么?

如果我更改为从“object”继承到“QWidget”,则代码会运行 bot,小部件不会显示。此外,当我尝试使用以下代码仅显示小部件本身时,它没有显示。

if __name__ == "__main__":
    import sys

    app = QApplication(sys.argv)
    w = Ui_Form()
    w.show()
    sys.exit(app.exec_())

空小部件

我试着四处搜索,但没有找到任何帮助我的东西,所以我在这里问我的问题。

有人可以向我解释为什么这一切都像现在这样发生吗?我如何才能让它们显示小部件并将它们添加到 scrollArea?

提前致谢!

使用 PySide 而不是 PyQt 的原因是您使用了 pyside-uic 工具而不是 pyuic,这是一个创建非常相似的文件但使用 PyQt 的工具。

PySide 和 PyQt 都是 python Qt 的绑定,它们几乎无缝地工作,除了一些实现上的差异;这意味着两件重要的事情:

  1. 它们不能一起使用;
  2. 大多数情况下,您只需更改 each 脚本开头的导入语句即可在它们之间切换(from PyQt5 import... 而不是 from PySide2 import...) ;

他们也有不同的许可证,所以如果你想创建一个商业程序,你需要检查一下。

关于创建的对象,也就是一般所说的“表单class”,用来“设置”一个Qt widget实例的:不是 一个小部件,但是某种 实用程序 .

为了正确使用这些生成的脚本(应该永远不会手动修改),您必须导入它们,然后将它们用作单独的实例,这将创建UI作为基础class进行多重继承,这是最常用的方法;以下示例假设您使用 pyuic (not pyside-uic) 生成名为 mywidget.py 的文件,并使用多重继承创建 QWidget:

from PyQt5 import QtWidgets
from mywidget import Ui_Form

class MyWidget(QtWidgets.QWidget, Ui_Form):
    def __init__(self):
        super().__init__()
        self.setupUi(self)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = MyWidget()
    w.show()
    sys.exit(app.exec_())

在有关 using Designer 的官方指南中阅读更多相关信息。

的答案中可以找到更多见解