Qt PyQt与PySide技术-C++库的Python绑定

发布于:2025-06-25 ⋅ 阅读:(16) ⋅ 点赞:(0)

一、概述

        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 sys

from 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_Widget

class 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 = 0
    def btnClickedSlot(self):
        self.clickedCnt+=1
        str = "按钮点击了%d次"%(self.clickedCnt)
        self.ui.label.setText(str)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    widget = Widget()
    widget.show()
    sys.exit(app.exec())

效果展示:
在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到