如何在 Python 中直接使用通过 "Qt designer" 生成的 Python 代码
How to use Python code generated via "Qt designer" directly in Python
我正在试验 Qt Designer,我注意到有一个选项可以获取 UI 的 Python 代码。
但是当我 运行 这段代码在 Python IDE 时没有任何反应。
这段代码是不是应该运行设计的UI?
编辑:
生成的代码如下所示:
# -*- 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, 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
您需要手动创建一个QApplication
,因为生成的代码只是界面部分。在 ui_form.py
文件旁边创建一个名为 main.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_())
该代码不是“运行”。它是一个基础“表单 class”,必须继承或实例化才能在 现有 QWidget 实例上构建实际的 UI。
您看到的结果与从命令行 运行ning pyuic 实用程序得到的结果相同。
从 python 测试 Ui 的简单方法是创建小部件的基本实例并使用 imported 形式 class 在小部件上“构建”它。对于非常简单的情况,以下内容就足够了:
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_())
这工作正常,但并没有真正提供子 class 可以提供的可扩展性。
为此,有两种可能性。
单继承方式:
概念与上述非常相似,但允许实现需要与信号交互的功能。
从ui_form导入Ui_Form
从 PySide2 导入 QtWidgets
class 我的小部件(QtWidgets.QWidget):
def __init__(自我):
超级().__init__()
self.ui = Ui_Form()
self.ui.setupUi(self)
<b>self.ui.</b>pushButton_2.clicked.connect(self.hello)
定义你好(自我):
打印('hello')
如果 __name__ == '__main__':
导入系统
应用程序 = QtWidgets.QApplication(sys.argv)
小部件=我的小部件()
widget.show()
sys.exit(app.exec_())
这很简单,但有一个小而重要的缺点:每个对象只能使用self.ui.someObject
.
访问
多重继承方式:
结果非常相似,但有利于将所有对象创建为实例的直接属性(self
,而不是 self.ui
)。
从ui_form导入Ui_Form
从 PySide2 导入 QtWidgets
class MyWidget(QtWidgets.QWidget, <b>Ui_Form</b>):
def __init__(自我):
超级().__init__()
<b>self.setupUi(自己)</b>
<b>self.</b>pushButton_2.clicked.connect(self.hello)
定义你好(自我):
打印('hello')
如果 __name__ == '__main__':
导入系统
应用程序 = QtWidgets.QApplication(sys.argv)
小部件=我的小部件()
widget.show()
sys.exit(app.exec_())
从根本上说,MyWidget
继承自 Qt class 和 的“形式class"(这是一个简单的 python 对象,只有一个已实现的方法,setupUi
)。
如你所见,它们都非常相似,但多重继承通常是首选方式,因为它更简单,即使只有“3个字符”,它实际上提高了代码的可读性。
我正在试验 Qt Designer,我注意到有一个选项可以获取 UI 的 Python 代码。
但是当我 运行 这段代码在 Python IDE 时没有任何反应。
这段代码是不是应该运行设计的UI?
编辑: 生成的代码如下所示:
# -*- 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, 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
您需要手动创建一个QApplication
,因为生成的代码只是界面部分。在 ui_form.py
文件旁边创建一个名为 main.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_())
该代码不是“运行”。它是一个基础“表单 class”,必须继承或实例化才能在 现有 QWidget 实例上构建实际的 UI。
您看到的结果与从命令行 运行ning pyuic 实用程序得到的结果相同。
从 python 测试 Ui 的简单方法是创建小部件的基本实例并使用 imported 形式 class 在小部件上“构建”它。对于非常简单的情况,以下内容就足够了:
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_())
这工作正常,但并没有真正提供子 class 可以提供的可扩展性。
为此,有两种可能性。
单继承方式:
概念与上述非常相似,但允许实现需要与信号交互的功能。
从ui_form导入Ui_Form
从 PySide2 导入 QtWidgets
class 我的小部件(QtWidgets.QWidget):
def __init__(自我):
超级().__init__()
self.ui = Ui_Form()
self.ui.setupUi(self)
<b>self.ui.</b>pushButton_2.clicked.connect(self.hello)
定义你好(自我):
打印('hello')
如果 __name__ == '__main__':
导入系统
应用程序 = QtWidgets.QApplication(sys.argv)
小部件=我的小部件()
widget.show()
sys.exit(app.exec_())
这很简单,但有一个小而重要的缺点:每个对象只能使用self.ui.someObject
.
多重继承方式:
结果非常相似,但有利于将所有对象创建为实例的直接属性(self
,而不是 self.ui
)。
从ui_form导入Ui_Form
从 PySide2 导入 QtWidgets
class MyWidget(QtWidgets.QWidget, <b>Ui_Form</b>):
def __init__(自我):
超级().__init__()
<b>self.setupUi(自己)</b>
<b>self.</b>pushButton_2.clicked.connect(self.hello)
定义你好(自我):
打印('hello')
如果 __name__ == '__main__':
导入系统
应用程序 = QtWidgets.QApplication(sys.argv)
小部件=我的小部件()
widget.show()
sys.exit(app.exec_())
从根本上说,MyWidget
继承自 Qt class 和 的“形式class"(这是一个简单的 python 对象,只有一个已实现的方法,setupUi
)。
如你所见,它们都非常相似,但多重继承通常是首选方式,因为它更简单,即使只有“3个字符”,它实际上提高了代码的可读性。