【问题标题】:Custom External Widget does not show up [duplicate]自定义外部小部件不显示 [重复]
【发布时间】:2021-10-22 16:00:57
【问题描述】:

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

直到那时一切正常,我想开始一些具体的事情,比如将我创建的小部件带入滚动区域。为此,我创建了一个自定义小部件并创建了一个 .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”继承,而是从“object”继承。此外,我的小部件没有“init”,而是一个“setupUi”。 这是为什么呢?

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

if __name__ == "__main__":
    import sys

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

空小部件

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

有人可以向我解释为什么这一切会像现在这样发生,以及我如何让它们显示小部件并将它们添加到滚动区域?

提前致谢!

【问题讨论】:

    标签: python qt-designer pyside2


    【解决方案1】:

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

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

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

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

    关于创建的对象,也就是通常所说的“表单类”,它用于“设置”一个Qt小部件实例:它不是小部件,而是某种实用程序。

    为了正确使用这些生成的脚本(应该永远手动修改),您必须导入它们,然后将它们用作将创建 UI 的单独实例或 em> 作为多继承的基类,是最常用的方法;下面的例子假设你使用pyuicnotpyside-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 的官方指南中了解更多信息。
    更多见解可以在this related post的答案中找到

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-06
      • 2021-11-18
      • 2013-04-06
      • 1970-01-01
      • 1970-01-01
      • 2015-11-19
      • 2021-12-29
      • 1970-01-01
      相关资源
      最近更新 更多