如何在 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个字符”,它实际上提高了代码的可读性。