Qt PyQt与PySide技术-C++库的Python绑定
- 一、概述
- 二、区别于联系
- 1、PyQt:Riverbank Computing的解决方案
- a、发展历程
- b、许可模式
- c、技术特点
- 2、PySide:Qt官方的Python绑定
- a、发展历程
- b、许可模式
- c、技术特点
- 三、对比
- 许可证
- 功能与兼容性
- 社区与维护
- 其他差异
- 四、迁移指南
- 五、未来展望
- 六、实例演示
一、概述
Qt是一个跨平台的C++图形用户界面应用程序开发框架,广泛用于桌面和嵌入式开发。PyQt和PySide是Qt的Python绑定库,允许开发者通过Python调用Qt的功能
Qt的Python绑定通过封装Qt的C++ API,为Python开发者提供了与Qt原生开发几乎相同的编程体验。这种绑定技术主要解决了两个核心问题:
- 类型转换:在Python和C++之间自动转换数据类型
- 信号槽机制:实现Qt特有的事件处理机制
二、区别于联系
1、PyQt:Riverbank Computing的解决方案
a、发展历程
PyQt起源于1998年,由英国公司Riverbank Computing开发,作为Qt框架的Python绑定工具。Qt本身由挪威公司Trolltech开发(现为The Qt Company),是一个跨平台的C++图形用户界面库。
PyQt由英国公司Riverbank Computing开发,是Qt最早的Python绑定方案:
- PyQt4:对应Qt4版本
- PyQt5:对应Qt5版本(2014年发布)
- PyQt6:对应Qt6版本(2020年发布)
b、许可模式
PyQt 是一个用于创建 GUI 应用程序的 Python 绑定库,其许可模式主要分为两种:GPL 和 商业许可。以下是详细说明。
GPL 许可:
PyQt 的默认许可是 GNU General Public License (GPL),适用于开源项目或遵循 GPL 协议的项目。
- 使用 GPL 许可的 PyQt 开发的应用程序必须开源,并遵循 GPL 条款。
- 适用于个人开发者、学术研究或开源社区项目。
- 无需支付许可费用,但需遵守 GPL 的传染性条款(即衍生作品也需开源)。
商业许可:
若开发者不希望开源其应用程序,可选择购买商业许可。
- 商业许可允许闭源开发,无需公开应用程序的源代码。
- 适用于企业或需要保护专有代码的商业项目。
- 需支付许可费用,具体费用取决于使用场景(如开发者数量、部署方式)。
c、技术特点
PyQt 是 Python 编程语言与 Qt 框架的结合,主要用于开发跨平台的 GUI 应用程序。其技术特点涵盖多个方面:
- 跨平台支持
PyQt 基于 Qt 框架,支持 Windows、macOS、Linux 等多种操作系统,代码无需修改即可在不同平台运行。
丰富的组件库
PyQt 提供大量预构建的 GUI 组件,如按钮、文本框、表格等,支持自定义控件和样式设计。 - 信号与槽机制
PyQt 采用 Qt 的信号与槽机制处理事件和通信,实现组件间的高效解耦和交互。 - 强大的工具集成
PyQt 包含 Qt Designer 工具,支持可视化界面设计,生成的 UI 文件可直接加载到 Python 代码中。 - 多线程支持
PyQt 提供 QThread 等类,支持多线程编程,避免 GUI 主线程阻塞。 - 国际化与本地化
支持多语言翻译(通过 Qt Linguist 工具),方便应用程序的国际化部署。 - 高性能渲染
利用 Qt 的绘图引擎(QPainter、OpenGL 集成),适合开发图形密集型应用。 - 灵活的许可证选项
PyQt 提供 GPL 和商业许可证,满足不同项目的合规需求。
2、PySide:Qt官方的Python绑定
a、发展历程
- PySide起源于2009年,由Nokia的Qt开发团队主导推出,旨在为Python开发者提供LGPL许可的Qt绑定,与当时采用更严格许可的PyQt形成竞争。PySide1基于Qt4,提供了完整的Qt模块支持。
- 2011年,随着Nokia战略调整,PySide项目陷入停滞。2013年,Qt公司重新接管项目维护,但PySide1的更新仍较为缓慢。2015年,跨版本项目PySide2启动,目标是支持Qt5的API。
- 2018年,PySide2发布正式版,成为首个支持Qt5的稳定版本。
- 2020年推出PySide6,适配Qt6框架并引入新型号系统。2021年后,PySide6的更新节奏与Qt版本保持同步,每半年发布功能更新。
b、许可模式
PySide 是 Qt 框架的 Python 绑定,由 Qt for Python 项目维护。其许可证模式基于 Qt 本身的许可结构,主要分为商业许可和开源许可两种形式。
商业许可证
商业许可证适用于需要专有软件开发的用户,提供以下优势:
- 允许闭源分发,无需公开修改后的代码。
- 包含官方技术支持,确保问题快速解决。
- 适合企业级应用或需要法律保障的场景。
商业许可证需直接联系 The Qt Company 购买。
开源许可证
PySide 默认提供 GNU Lesser General Public License (LGPL) 和 General Public License (GPL) 两种选项:
- LGPL:允许动态链接 PySide 库到闭源项目,但修改 PySide 本身需开源。适合大多数商业应用。
- GPL:任何使用 PySide 的项目必须开源。适用于完全开源的项目。
c、技术特点
PySide是Qt框架的Python绑定,允许开发者使用Python语言开发跨平台的GUI应用程序。其核心特点如下:
- 跨平台支持
PySide
基于Qt,支持Windows、macOS、Linux等主流操作系统,确保应用程序在不同平台上具有一致的行为和外观。 - LGPL许可
PySide
采用LGPL(GNU Lesser General Public License)开源协议,允许在商业闭源项目中免费使用,降低法律风险。 - 丰富的组件库
提供完整的Qt模块,包括GUI控件(QWidget、QML)、网络(QtNetwork)、数据库(QtSql)、多媒体(QtMultimedia)等,满足多样化开发需求。 - 信号与槽机制
继承Qt的信号与槽机制,实现对象间的高效通信,支持松耦合设计。例如:button.clicked.connect(lambda: print("Button clicked"))
- Pythonic API设计
相比PyQt,PySide的API更贴近Python风格,部分接口命名更符合Python习惯,降低学习成本。 - 与Qt版本同步更新
PySide
紧跟Qt官方版本发布,确保兼容最新功能,如Qt6对应的PySide6支持现代图形API(Vulkan、Metal)。 - 高性能
通过C++底层优化,PySide
的运行时效率接近原生Qt应用,适合开发高性能应用。 - 多语言支持
内置国际化工具(Qt Linguist
),方便实现多语言界面切换。 - 3D与图形支持
集成Qt 3D
模块和OpenGL
绑定,适用于游戏、CAD等图形密集型应用开发。
三、对比
以下是 PyQt 和 PySide 的对比表格,主要从许可证、功能、兼容性等方面进行比较:
许可证
对比项 | PyQt | PySide |
---|---|---|
许可证类型 | GPL 或商业许可证 | LGPL |
商业使用成本 | 需购买商业许可证 | 免费 |
开源限制 | GPL 要求开源衍生代码 | LGPL 允许闭源商业使用 |
功能与兼容性
对比项 | PyQt | PySide |
---|---|---|
绑定生成工具 | SIP | Shiboken |
Qt 版本支持 | 支持最新 Qt 版本 | 支持最新 Qt 版本 |
API 一致性 | 高度兼容 Qt | 高度兼容 Qt |
文档完整性 | 官方文档丰富 | 文档较 PyQt 略少 |
社区与维护
对比项 | PyQt | PySide |
---|---|---|
维护方 | Riverbank Computing | Qt 官方(The Qt Company) |
社区活跃度 | 较高 | 逐渐增长 |
更新频率 | 定期更新 | 定期更新 |
其他差异
对比项 | PyQt | PySide |
---|---|---|
信号与槽语法 | pyqtSignal / pyqtSlot | 原生 Signal / Slot |
默认导入模块 | PyQt5.QtCore | PySide2.QtCore |
历史发展 | 出现较早,成熟稳定 | Qt 官方支持,后期发展迅速 |
可根据具体需求(如许可证、开发成本、项目规模)选择合适工具。以下是 PyQt 和 PySide 的对比表格,主要从许可证、功能、兼容性等方面进行比较:
四、迁移指南
从PyQt迁移到PySide相对简单,主要差异包括:
1、导入语句:
# PyQt5
from PyQt5.QtWidgets import QApplication, QLabel# PySide2
from PySide2.QtWidgets import QApplication, QLabel
2、信号槽语法:
# PyQt5风格
button.clicked.connect(self.on_button_click)# PySide2/6风格(推荐)
button.clicked.connect(self.on_button_click)
# 或使用装饰器
@Slot()
def on_button_click(self):pass
五、未来展望
随着Qt的持续发展,PyQt和PySide也将不断完善:
- Qt6的普及:PySide6作为官方绑定将获得更多资源支持
- 许可模式优化:PySide的LGPLv3许可将吸引更多商业用户
- 工具链整合:与Qt Creator等工具的集成将更加完善
- 跨平台一致性:在Windows、macOS和Linux上提供更一致的开发体验
六、实例演示
源码:
# This Python file uses the following encoding: utf-8
import sysfrom PySide6.QtWidgets import QApplication, QWidget# Important:
# You need to run the following command to generate the ui_form.py file
# pyside6-uic form.ui -o ui_form.py, or
# pyside2-uic form.ui -o ui_form.py
from ui_form import Ui_Widgetclass Widget(QWidget):def __init__(self, parent=None):super().__init__(parent)self.ui = Ui_Widget()self.ui.setupUi(self)self.ui.pushButton.clicked.connect(self.btnClickedSlot)self.clickedCnt = 0def btnClickedSlot(self):self.clickedCnt+=1str = "按钮点击了%d次"%(self.clickedCnt)self.ui.label.setText(str)if __name__ == "__main__":app = QApplication(sys.argv)widget = Widget()widget.show()sys.exit(app.exec())
效果展示: