pyside简介及打包
Qt是使用C++语言开发的跨平台用户图形界面应用程序开发框架
Qt的python移植主要有PySide和PyQt两个库
许可证:PyQt使用GPL和商业许可证,GPL版本要求开源,如果要闭源需要购买商业许可证 PySide使用LGPL,允许在闭源项目中使用而无需购买商业许可证 开发者:PyQt由Riverbank Computing开发和维护 PySide由Qt公司开发和维护,为Qt官方的一部分 API兼容性:两者的API非常相似,但在某些细节上可能有所不同
基于许可证的不同和开发者的不同,我们选择pyside进行学习
当前pyside的最新版本是pyside6,对应Qt6版本
pyside的官网文档网址为:https://doc.qt.io/qtforpython
pyside的安装: pip install pyside6
安装完成后再python安装根目录下的Script目录下会创建多个pyside6的相关工具,常用的有
pyside6-designer 打开用户界面可视化设计工具Qt Designer 实际运行的是python根目录中的"Lib/site-packages/PySide6/designer.exe"程序 pyside6-uic 将Qt Designer生成的".ui"文件转换为Python代码 pyside6-metaobjectdump 分析和显示".py"文件中的应用程序元信息,包括类名、信号、槽、属性等 pyside6-metaobjectdump python_file.py pyside6-rcc 打包静态资源 实际运行的是python根目录中的"Lib/site-packages/PySide6/rcc.exe"程序 pyside6-deploy 程序打包
pyside实现了非常多的功能,位于python安装根目录下的"Lib/site-packages/PySide6"文件夹下的".pyd"文件
常用的功能模块
核心模块 QtCore 事件循环和信号/槽机制 处理时间和日期 提供线程类和相关工具 提供文件和目录管理的类 提供各种数据类型和容器类 提供定时器类 QtGui 各种图形对象的类 如字体管理、文本渲染、颜色、绘图、效果(如阴影、模糊和渐变)、场景管理、交互逻辑 QtWidgets 创建应用程序和用于显示的用户界面 提供各种类型的窗口,如显示窗口、对话框(文件选择、颜色选择、消息框等)和工具窗口 支持多种布局(如水平布局、垂直布局和网格布局)和显示方式 提供丰富的控件,如按钮、标签、文本框等 事件处理,允许开发者处理用户输入、窗口事件和其他系统事件 支持样式表(类似CSS) 总的来讲,上面三个核心模块是按照开发的深度一步步通过继承来完成的 QtCore --> QtGui --> QtWidgets QtCore是最底层的,提供了通用的功能实现,但是没有实现界面渲染相关功能,在某些不需要界面的程序开发中使用该模块 QtGui是实现GUI的渲染等相关功能实现,但是没有实现界面显示相关功能,是一个中间层 QtWidgets是基于QtGui的基础上实现了界面显示的相关功能,并添加了多种组件、样式表等功能,当需要开发GUI程序时需要使用该模块 在QtCore模块的Qt模块中,定义了常用的常量 并行相关 QtConcurrent 提供多种并行算法,如map, filter, reduce等,允许在多核处理器上并行处理数据 画图和图表相关 QtOpenGL 集成 OpenGL 图形渲染,OpenGL 上下文管理、OpenGL 绘制支持、与 Qt Widgets 集成、帧缓冲对象 (FBO)、多种渲染技术,如纹理映射、光照和阴影、提供事件处理机制 QtOpenGLWidgets QtCharts 图表 QtDataVisualization 创建和展示三维图形 QtGraphs 创建和管理图形数据可视化交互 图标相关 QtExampleIcons 管理和使用图标,常用于工具栏、按钮和菜单中,提供直观的操作指示 多媒体相关 QtMultimedia 处理多媒体内容,音频/视频播放、音频录制、视频捕获、多媒体控制、媒体元数据、多媒体设备管理 QtMultimediaWidgets 创建多媒体相关用户界面 QtSpatialAudio 处理空间音频,模拟声音环境音效和从不同方向和距离传来的效果实现三维音频体验 设备相关 QtBluetooth 蓝牙 QtNfc 处理近场通信(NFC)设备管理、读写NFC标签、设备发现、数据交换、格式化和类型支持、事件处理 QtSensors 访问和管理传感器数据(如加速度计、陀螺仪、磁力计、温度传感器等) 数据库相关 QtSql 用于数据库访问和管理 网络和web相关 QtHttpServer 创建和管理 HTTP 服务器,常用于开发和测试阶段,方便开发者快速验证和调试 HTTP 接口 QtNetwork 处理网络通信,TCP/IP 和 UDP 通信、发送和接收 HTTP 请求、网络状态监控、SSL 支持、DNS 查询、代理、多线程支持 QtNetworkAuth 处理网络身份验证 对 OAuth 1.0 和 OAuth 2.0 认证协议的支持 管理身份验证的各个阶段,包括请求授权、获取访问令牌和刷新令牌 允许与多种身份验证服务集成,如Google、Twitter等,简化用户登录流程 提供安全的令牌存储和传输机制、与用户界面组件的集成 允许在应用程序中显示登录对话框和授权提示 处理身份验证成功或失败的回调 QtUiTools 处理Qt用户界面文件,提供从 ui文件加载界面的功能,使得开发者可以在代码中动态创建 UI QtWebChannel 实现 Qt 应用程序与 Web 应用程序之间通信,使得 Qt 应用程序可以与网页中的 JavaScript 进行双向通信 QtWebEngineCore 集成和处理 Web 内容,加载和显示网页、与网页中的 DOM 进行交互、通过重载特定的事件处理器来定制网页的行为 QtWebEngineWidgets QtWebSockets 实现WebSocket通信 信息通讯相关 QtDBus 用于与 D-Bus 进行交互 QtRemoteObjects 实现远程对象通信,在不同进程间通过网络或本地连接进行对象的远程访问和调用,支持分布式应用程序的开发 QtSerialBus、QtSerialPort 用于处理串行总线通信,用于设备间的通信 格式文件处理和显示 QtPdf 处理PDF文档 QtPdfWidgets 在用户界面中嵌入PDF查看器 QtSvg QtSvgWidgets QtXml 处理XML数据 位置相关 QtLocation 处理地理位置和地图相关功能 提供地图视图、坐标和可读地址的互转、访问设备当前位置、 计算和显示从一个地点到另一个地点的路径、标记和管理地图上的兴趣点、 在地图上添加自定义图层和叠加物 QtPositioning 处理地理位置和定位功能 获取设备当前地理位置的功能、实时位置更新、坐标和可读地址的互转、 提供与位置服务的接口,如 GPS 和网络定位 打印相关 QtPrintSupport打印功能,打印对话框、打印机管理、文档打印、页面设置、打印预览、自定义打印
基本运行步骤
1、应用程序初始化 app = PySide6.QtWidgets.QApplication(...args) 2、创建界面对象用于显示 win = PySide6.QtWidgets.QWidget(parent=None) 3、创建各种显示的界面对象并按照指定规则(布局或绝对定位)摆放 4、显示界面对象并运行事件循环 win.show() 5、关闭窗口停止事件循环
在Qt中,窗口和组件(按钮、图表、画图等)都是QWidget类的子类,这里我们统一称之为界面
在创建界面对象时一般第一个参数指定父界面,当没有父界面时使用None
这些不同功能的子类有的可以显示子界面,有的无法显示子界面,窗口可以视为一个特殊的仅用来容纳子界面的界面
界面对象拥有show()方法用于显示该界面及其所有子孙界面
如果一个界面对象拥有父界面(父界面不为None),当运行show()后不会显示该界面但程序进入了事件循环,导致我们无法通过关闭显示的窗口来停止事件循环
也就是说只有父界面为None的界面对象使用show()才有意义
当多个父界面为None的界面对象运行了show()方法,会显示为多个窗口,只有当所有窗口都关闭时才会停止事件循环
pyside6-uic工具
用于将Qt Designer生成的".ui"文件转换为Python代码
-d / --dependencies 显示依赖关系 -o / --output file 输出至文件file,默认stdout -a / --no-autoconnection 禁用自动连接信号和槽 -c / --connections pmf|string 自动连接信号和槽,默认值 pmf表示使用"指针到成员函数"的方式进行连接,一般C++中使用 string表示使用字符串形式的连接 -p / --no-protection 禁用生成代码中类和成员变量的保护机制(如使用 _ 前缀标记为私有) --postfix fix 添加后缀到所有生成的类名中 --include file 在输出中包含指定文件的内容,避免在运行时出现找不到类或函数 -g / --generator python|cpp 输出文件类型,默认python --from-imports 生成Python代码中使用from语句,默认值 --absolute-imports 生成Python代码中使用绝对导入,实测无效果 --star-imports 生成Python代码中使用*导入
生成的py文件中有一个已经定义好的类(默认为Ui_MainWindow),该类中的setupUi()方法用于设置显示窗口中的内容
setupUi()方法接受一个界面对象作为所有界面的基础界面,后续所有设置都是基于该窗口对象
实际开发中,我们需要编写一些其他额外的代码来运行程序
app = QApplication(sys.argv)
// 创建一个应用程序对象
win = QWidget()
// 创建一个界面对象
ui=Ui_MainWindow()
// 创建一个我们生成的py中的类对象
ui.setupUi(win)
// 运行setupUi()方法
win.show()
// 开启事件循环
sys.exit(app.exec())
// 退出程序
pyside6-rcc工具
用于将静态资源打包进程序
命令格式:pyside6-rcc [options] inputs
inputs
inputs 表示静态资源的qrc文件 qrc文件(Qt Resource File)是资源文件,用于存储项目中使用的资源 这些资源可以通过.qrc文件进行组织和管理,并在应用程序中方便地访问 qrc文件是一个XML格式文件,包含了各种资源信息,以及资源在程序中的逻辑路径,每个资源都通过一个``标签指定 qrc文件示例 <!DOCTYPE RCC><RCC version="1.0"> 或者直接 <RCC> 就行 <qresource> <file>images/copy.png</file> <file>images/cut.png</file> <file>images/new.png</file> <file>images/open.png</file> <file>images/save.png</file> </qresource> </RCC>
options
-o、 --output file 将输出写入file,默认stdout -t、 --temp file 对于大资源使用临时file --pass num 大资源的大小阈值 --name name 输出文件中创建一个名称为name的初始化函数 --root path 在资源访问路径前添加根路径。 --compress-algo algo 使用算法algo压缩输入文件(zlib,none) --compress level 按level压缩输入文件 --no-compress 禁用压缩,等同于--compress-algo none --no-zstd 禁用zstd压缩。 --threshold level 考虑压缩文件的阈值 --binary 输出用作动态资源的二进制文件 -g、 --generator cpp|python|python2 选择生成文件的类型 --verbose 启用详细模式 --list 仅列出.qrc文件条目,不生成代码 --list mapping 仅输出资源路径到.qrc文件中定义的文件系统路径的映射,不生成代码 -d、 --depfile file 用.qrc编写depfile对file的依赖关系 --project 输出一个包含所有内容的资源文件当前目录中的文件 --format-version number> 要写入的RCC格式版本
使用示例
sources.qrc文件 <!DOCTYPE RCC><RCC version="1.0"> <qresource> <file>images/copy.png</file> <file>images/cut.png</file> </qresource> </RCC> 运行命令:pyside6-rcc -o sources.py sources.qrc python片段 from PySide6.QtGui import QPixmap import resources # 导入生成的资源文件 label = QLabel() pixmap = QPixmap(":/images/icon.png") # 使用资源路径 label.setPixmap(pixmap)
pyside6-deploy
用于程序打包,使用的nuitka软件进行打包,如果没有安装会自动安装
-c / --config-file file 指定.spec配置文件的路径 --init 创建pysidedeploy.spec文件 --dry-run 显示要运行的Nuitka完整命令 --keep-deployment-files 保留生成的中间文件 --name name 应用程序名称 --extra-ignore-dirs 忽略目录,多个以逗号隔开,在搜索与项目相关的Python文件时将跳过这些目录 --extra-modules 需要加载的模块,多个以逗号隔开 在使用import PySide6引入模块时可能会在加载模块时遗漏 使用from PySide6 import格式时不会发生遗漏 指定的模块名可以省略Qt前缀,如 --extra-modules=Network,Svg 等价于 --extra-modules=QtNetwork,QtSvg
pysidedeploy.spec文件
打包的编译配置文件,用于替代和补充pyside6-deploy打包,格式类似于ini配置文件,以井号(#)开头的为注释行
[app] title = 应用程序的名称 project_dir = 项目目录 # 一般默认项目目录是主Python入口文件的父目录 input_file = 主Python入口文件 exec_directory = 生成可执行文件的目录 icon = 应用程序图标 # Windows格式必须为.ico,macOS格式必须为.icns,Linux所有标准图像格式都可 [python] python_path = Python可执行文件的路径 packages = 指定安装的软件包 # 默认将安装nuitka、ordered_set和zstandard,如果基于Linux还会安装patchelf # 示例:packages = Nuitka==2.1,ordered_set==1.5 [qt] modules = 需要加载的模块,多个以逗号隔开 # 对应命令行的--extra-modules选项 # 会自动计算并写入配置文件 plugins = 需要加载的插件,多个以逗号隔开 # 会自动计算并写入配置文件 [nuitka] macos.permissions:仅与 macOS 相关。此选项列出了 macOS 应用程序,如 macOS 应用程序包的文件中所示,使用 所谓的 UsageDescription 字符串。权限通常由 自动找到。但是,用户也可以使用格式: 显式指定它们。例如,指定了 Camera 权限 如:Info.plistpyside6-deploy NSCameraUsageDescription:CameraAccess extra_args = Nuitka运行参数 # 默认为:--quiet --noinclude-qt-translations [buildozer] mode = release|debug # 编译的模式 local_libs = 其他要加载的库,多个使用逗号分隔,将在程序启动时加载 arch = 部署的平台架构 # 可选值"aarch64", "armv7a", "i686", "x86_64" [android] ...