当前位置: 首页 > news >正文

【翻译】在 Python 应用程序中使用Qt Designer的UI文件

原文地址:Using a Designer UI File in Your Qt for Python Application

直接上图,上代码
在这里插入图片描述

将UI文件转为Python

To demonstrate, we use the Qt Widgets animation easing example.
为了演示,我们使用 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)

self.m_ui.graphicsView.setScene(self.m_scene)

Besides <font style="color:rgb(64, 66, 68);">setupUi()</font>, <font style="color:rgb(64, 66, 68);">Ui_Form</font> provides another method <font style="color:rgb(64, 66, 68);">retranslateUi()</font>, which can be called in reaction to a QEvent of type QEvent.LanguageChange, which indicates a change in the application language.

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 环境变量。

基于表述尽可能保持简洁的原因,本文未完全按照原文翻译


http://www.mrgr.cn/news/45838.html

相关文章:

  • C++ static静态
  • 道路积水检测数据集 1450张 路面积水 带分割 voc yolo
  • 清华大模型公开课第二季 | Lecture 2 神经网络与大模型基础 Part 1
  • Java开发者测试:Junit5
  • 系统架构设计师论文《论企业集成平台的理解与应用》精选试读
  • [Algorithm][贪心][整数替换][俄罗斯套娃信封问题]详细讲解
  • Day44【最短路+欧拉回路】
  • HeidiSQL 数据库密码如何恢复
  • 告别@Value,Spring Boot 3.3更优雅的配置注入方案
  • linux自动挂载tf卡
  • Spring系列 Bean创建过程
  • Kubernetes 深度探索:StatefulSet 之有状态应用实战
  • React Route v6. 如何防止用户导航到另一个页面
  • 数据结构-4.6.KMP算法(旧版下)-朴素模式匹配算法的优化
  • aws(学习笔记第四课) AWS的IAM服务,用于授权的策略,用户和组以及角色
  • docker compose入门5—创建一个3副本的应用
  • ◇【论文_20181020 v6】广义优势估计器 (generalized advantage estimator, GAE)
  • PicGo 配置 GitHub 作为后端存储,打造免费的图床工具
  • 知识改变命运 数据结构【java对象的比较】
  • Kubernetes 深度洞察:StatefulSet 之存储状态探秘