原文地址:Using a Designer UI File in Your Qt for Python Application
直接上图,上代码
将UI文件转为Python
为了演示,我们使用 Qt Widgets 简单示例说明。
这个应用程序由一个源文件 easing.py
、一个 UI 文件 form.UI
、一个资源文件 easing.qrc
和项目文件 easing.pyproject
组成,项目文件采用 YAML 格式:
{"files": ["easing.qrc", "ui_form.py", "easing.py", "easing_rc.py","form.ui"]
}
form.ui
文件通过uic(User Interface Compiler (uic))命令转换为Python文件ui_form.py
:
uic -g python form.ui > ui_form.py
PS: 官网的介绍太啰嗦,也不清楚这个easing.pyproject是手动创建的还是哪个IDE自动创建的,总之没啥用,还一头雾水,实际上有更简单的方法,详见:
【原创】Anaconda+VScode+PySide6 完美配置Python开发环境,亲测!
简单来说是用Qt for Python插件自动生成ui_form.py及easing_rc.py,文中里有详细的图文介绍,这里不再赘述。
本文的项目即是在此环境中生成的,这里是下载地址。
原文的代码写的不完整,完整的代码如下:
easing.ui
文件代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"><class>Form</class><widget class="QMainWindow" name="Form"><property name="geometry"><rect><x>0</x><y>0</y><width>800</width><height>600</height></rect></property><property name="windowTitle"><string>Form</string></property><property name="windowIcon"><iconset resource="easing.qrc"><normaloff>:/icon/icon/huawei.png</normaloff>:/icon/icon/huawei.png</iconset></property><widget class="QWidget" name="centralwidget"/><widget class="QMenuBar" name="menubar"><property name="geometry"><rect><x>0</x><y>0</y><width>800</width><height>21</height></rect></property></widget><widget class="QStatusBar" name="statusbar"/></widget><resources><include location="easing.qrc"/></resources><connections/>
</ui>
自动生成的ui_form.py如下:
# -*- coding: utf-8 -*-################################################################################
## Form generated from reading UI file 'form.ui'
##
## Created by: Qt User Interface Compiler version 6.6.3
##
## WARNING! All changes made in this file will be lost when recompiling UI file!
################################################################################from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,QMetaObject, QObject, QPoint, QRect,QSize, QTime, QUrl, Qt)
from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,QFont, QFontDatabase, QGradient, QIcon,QImage, QKeySequence, QLinearGradient, QPainter,QPalette, QPixmap, QRadialGradient, QTransform)
from PySide6.QtWidgets import (QApplication, QMainWindow, QMenuBar, QSizePolicy,QStatusBar, QWidget)
import easing_rcclass Ui_Form(object):def setupUi(self, Form):if not Form.objectName():Form.setObjectName(u"Form")Form.resize(800, 600)icon = QIcon()icon.addFile(u":/icon/icon/huawei.png", QSize(), QIcon.Normal, QIcon.Off)Form.setWindowIcon(icon)self.centralwidget = QWidget(Form)self.centralwidget.setObjectName(u"centralwidget")Form.setCentralWidget(self.centralwidget)self.menubar = QMenuBar(Form)self.menubar.setObjectName(u"menubar")self.menubar.setGeometry(QRect(0, 0, 800, 21))Form.setMenuBar(self.menubar)self.statusbar = QStatusBar(Form)self.statusbar.setObjectName(u"statusbar")Form.setStatusBar(self.statusbar)self.retranslateUi(Form)QMetaObject.connectSlotsByName(Form)# setupUidef retranslateUi(self, Form):Form.setWindowTitle(QCoreApplication.translate("Form", u"Form", None))# retranslateUi
easing.py
代码如下:
import sys
from PySide6.QtWidgets import QApplication, QMainWindow
from ui_form import Ui_Form # 根据实际生成的文件名导入class MainWindow(QMainWindow):def __init__(self):super().__init__()self.ui = Ui_Form() # 创建 UI 对象self.ui.setupUi(self) # 设置 UIif __name__ == "__main__":app = QApplication(sys.argv)window = MainWindow()window.show() # 显示窗口sys.exit(app.exec()) # 运行应用
form.ui
文件自动生成的文件名为ui_form.py
,如上图,主窗口objectName设置为Form
其生成的Python文件Class名即为Ui_Form
。
即可通过Ui_Form
调用此widget窗口。
除了 setupUi ()
之外,Ui_Form
还提供了另一个方法 retransateUi ()
,可以通过调用QEvent.LanguageChange 方法,用来改变UI界面显示语言。
self.ui.graphicsView.setScene(self.scene)
UiTools 方法
官网上的这部分代码在我的环境(Python3.8.20)中没跑起来,暂时没找到原因。
以下代码是Using .ui files from Designer or QtCreator with QUiLoader and pyside6-uic中的,之所以没有用原文链接中的代码,是因为其代码根本就不全,别说跑起来了。
import sys
from PySide6.QtUiTools import QUiLoader
from PySide6.QtWidgets import QApplication
from PySide6.QtCore import QFile, QIODeviceif __name__ == "__main__":app = QApplication(sys.argv)ui_file_name = "form.ui"ui_file = QFile(ui_file_name)if not ui_file.open(QIODevice.ReadOnly):print(f"Cannot open {ui_file_name}: {ui_file.errorString()}")sys.exit(-1)loader = QUiLoader()window = loader.load(ui_file)ui_file.close()if not window:print(loader.errorString())sys.exit(-1)window.show()sys.exit(app.exec())
导入资源文件
单一目录使用场景
当使用Qt Designer设计UI时,若引用了资源文件(如easing.qrc),form.ui
文件中会包含以下代码
<resources><include location="easing.qrc"/></resources>
自动生成的ui_form.py
中也会自动添加
import easing_rc
目录树场景
有些项目有更复杂的目录结构,如qrc文件和ui文件在多级目录下,如下目录结构:
projectresources (resources.qrc)ui (.ui files)
这种情况下当使用Qt Designer设计UI时,若引用了资源文件(如resources.qrc),*.ui
文件中会包含以下代码
<resources><include location="../resources/resources.qrc"/></resources>
自动生成的ui_*.py
中也会自动添加
import resources.resources_rc
对于更深层次的嵌套,可以使用Python的os.path
等方法,如果未设置路径,系统会自动检查PYTHONPATH
环境变量。
基于表述尽可能保持简洁的原因,本文未完全按照原文翻译