自定义外部小部件不显示
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 的绑定,它们几乎无缝地工作,除了一些实现上的差异;这意味着两件重要的事情:
- 它们不能一起使用;
- 大多数情况下,您只需更改 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 的官方指南中阅读更多相关信息。
在
的答案中可以找到更多见解
我想为我编写的 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 的绑定,它们几乎无缝地工作,除了一些实现上的差异;这意味着两件重要的事情:
- 它们不能一起使用;
- 大多数情况下,您只需更改 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 的官方指南中阅读更多相关信息。
在