如何解决如何在Python中直接使用通过“Qt设计器”生成的Python代码
我在尝试 Qt Designer 时发现有一个选项可以为 UI 获取 Python 代码。
但是当我在 Python IDE 中运行此代码时,没有任何反应。
这段代码不应该运行设计的用户界面吗?
编辑: 生成的代码如下所示:
# -*- coding: utf-8 -*-
################################################################################
## Form generated from reading UI file 'designertfNTig.ui'
##
## Created by: Qt User Interface Compiler version 5.15.2
##
## WARNING! All changes made in this file will be lost when recompiling UI file!
################################################################################
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
class Ui_Form(object):
def setupUi(self,Form):
if not Form.objectName():
Form.setObjectName(u"Form")
Form.resize(640,480)
self.verticalLayoutWidget = QWidget(Form)
self.verticalLayoutWidget.setObjectName(u"verticalLayoutWidget")
self.verticalLayoutWidget.setGeometry(QRect(179,9,251,471))
self.verticalLayout = QVBoxLayout(self.verticalLayoutWidget)
self.verticalLayout.setObjectName(u"verticalLayout")
self.verticalLayout.setContentsMargins(0,0)
self.pushButton_2 = QPushButton(self.verticalLayoutWidget)
self.pushButton_2.setObjectName(u"pushButton_2")
self.verticalLayout.addWidget(self.pushButton_2)
self.retranslateUi(Form)
QMetaObject.connectSlotsByName(Form)
# setupUi
def retranslateUi(self,Form):
Form.setWindowTitle(QCoreApplication.translate("Form",u"Form",None))
self.pushButton_2.setText(QCoreApplication.translate("Form",u"PushButton",None))
# retranslateUi
解决方法
该代码不打算“运行”。它是一个基本的“表单类”,必须继承或实例化才能在现有 QWidget 实例上构建实际的 UI。
您看到的结果与从命令行运行 pyuic 实用程序得到的结果相同。
从 python 测试 Ui 的简单方法是创建小部件的基本实例,并使用 导入 表单类在小部件上“构建”它。对于非常简单的情况,以下内容就足够了:
from ui_form import Ui_Form
from PySide2 import QtWidgets
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
widget = QtWidgets.QWidget()
ui = Ui_Form()
ui.setupUi(widget)
widget.show()
sys.exit(app.exec_())
这工作正常,但并没有真正提供子类所能提供的可扩展性。
为此,有两种可能性。
单继承方式:
这个概念与上面的非常相似,但允许实现需要与信号交互的函数。
from ui_form import Ui_Form
from PySide2 import QtWidgets
class MyWidget(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.ui = Ui_Form()
self.ui.setupUi(self)
self.ui.pushButton_2.clicked.connect(self.hello)
def hello(self):
print('hello')
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
widget = MyWidget()
widget.show()
sys.exit(app.exec_())
这非常简单,但有一个非常重要的小缺点:每个对象只能使用 self.ui.someObject
访问。
多重继承方式:
结果非常相似,但好处是可以将所有对象创建为实例的直接属性(self
,而不是 self.ui
)。
from ui_form import Ui_Form
from PySide2 import QtWidgets
class MyWidget(QtWidgets.QWidget,Ui_Form):
def __init__(self):
super().__init__()
self.setupUi(self)
self.pushButton_2.clicked.connect(self.hello)
def hello(self):
print('hello')
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
widget = MyWidget()
widget.show()
sys.exit(app.exec_())
从根本上说,MyWidget
继承了 Qt 类和“表单类”(这是一个简单的 Python 对象,只有一个已实现的方法,setupUi
)。
如您所见,它们都非常相似,但通常首选的方式是多重继承,因为它更简单,即使只有“3 个字符”,实际上也提高了代码的可读性。
,您需要手动创建QApplication
,因为生成的代码只是界面部分。在 main.py
文件旁边创建一个名为 ui_form.py
的文件并写入:
import sys
from PySide2.QtWidgets import QApplication,QWidget
from ui_form import Ui_Form
app = QApplication(sys.argv)
form = Ui_Form()
form.setupUi(QWidget())
form.show()
sys.exit(app.exec_())
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。