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

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 的对比表格,主要从许可证、功能、兼容性等方面进行比较:

许可证

对比项PyQtPySide
许可证类型GPL 或商业许可证LGPL
商业使用成本需购买商业许可证免费
开源限制GPL 要求开源衍生代码LGPL 允许闭源商业使用

功能与兼容性

对比项PyQtPySide
绑定生成工具SIPShiboken
Qt 版本支持支持最新 Qt 版本支持最新 Qt 版本
API 一致性高度兼容 Qt高度兼容 Qt
文档完整性官方文档丰富文档较 PyQt 略少

社区与维护

对比项PyQtPySide
维护方Riverbank ComputingQt 官方(The Qt Company)
社区活跃度较高逐渐增长
更新频率定期更新定期更新

其他差异

对比项PyQtPySide
信号与槽语法pyqtSignal / pyqtSlot原生 Signal / Slot
默认导入模块PyQt5.QtCorePySide2.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())

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/85919.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/85919.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用.detach()代替requires=False避免计算图错误

解决对一个对象多次BP更新时造成的RuntimeError: you can only change requires_grad flags of leaf variables.问题_解决对一个对象多次bp更新时造成的问题-CSDN博客 代码中存在一个特征需要参与辅助损失的计算,由于需要反复进行反向传播更新,计算图容易…

linux+docker+ollama+git常用指令

1、Linux命令 新建txt文件:touch xxx.txt 给txt文件夹权限:chmod x xxx.txt 查看日志:tail -f xxx.log / less xxx.log 根据关键字查看日志:grep "error" 文件名 查看端口状态:netstat -an|grep xxxxx 查看…

【八股消消乐】消息队列优化—系统架构设计

😊你好,我是小航,一个正在变秃、变强的文艺倾年。 🔔本专栏《八股消消乐》旨在记录个人所背的八股文,包括Java/Go开发、Vue开发、系统架构、大模型开发、具身智能、机器学习、深度学习、力扣算法等相关知识点&#xff…

WebSocket长连接在小程序中的实践:消息推送与断线重连机制设计

一、引言:为什么需要WebSocket长连接? 传统方案的痛点:HTTP轮询的低效性(高延迟、高资源消耗)小程序场景需求:实时消息推送(如IM、直播弹幕、IoT设备状态同步)技术选型对比&#xf…

MySQL索引使用指南:何时该为字段添加索引?

在MySQL的性能优化中,索引是最常用且有效的手段之一。但“索引不是万能药”——盲目添加索引可能导致写操作变慢、存储空间浪费,甚至引发索引失效问题。本文将结合原理与实战场景,帮你理清​​“何时该用索引”​​的核心判断逻辑。 一、先理…

AI时代关键词SEO优化

内容概要 在人工智能(AI)驱动的时代浪潮下,搜索引擎优化(SEO)正迎来深刻变革,关键词策略已成为流量获取的核心战场。本文将系统剖析AI时代关键词优化的前沿方法,涵盖语义分析的精准研究、用户意…

GO 语言学习 之 代码风格

1. 命名规范 字母数字和下划线组成 以小写字母、大写字母或下划线开头 不允许包含标点符号、运算符、空白字符(空格、TAB、换行)等 采用驼峰命名法 (大驼峰、小驼峰) 见名知义:命名要有实际意义,易读性&am…

【软考高级系统架构论文】论云上自动化运维及其应用

论文真题 云上自动化运维是传统IT运维和 DevOps的延伸,通过云原生架构实现运维的再进化。云上自动化运维可以有效帮助企业降低IT运维成本,提升系统的灵活度,以及系统的交付速度,增强系统的可靠性,构建更加安全、可信、开放的业务平台。 请围绕“云上自动化运维及其应用”…

错误: 程序包androidx.fragment.app不存在 import android

错误: 程序包androidx.fragment.app不存在 import androidx.fragment.app.FragmentActivity; 这个是什么错?dependencies { //implementation fileTree(dir: libs, include: [*.jar]) implementation project(path: :libscan) //noinspection GradleCompatible implementation…

Java UDP Socket 实时在线刷卡扫码POS消费机门禁控制板服务端示例源码

本示例使用的设备&#xff1a;https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.52de2c1bYG0BuO&ftt&id17021194999 一、获取本电脑所有网卡IP public static String getIP() {Enumeration<NetworkInterface> netInterfaces;ArrayList<String>…

MATLAB基础应用精讲-【数模应用】层次分析法(AHP)(附MATLAB和python代码实现)

目录 前言 算法原理 什么是层次分析法(AHP) 注意事项 基本原理 算法步骤 1建立层次结构 2构建判断矩阵 3计算权重向量 4一致性检验 SPSSAU AHP层次分析案例 1、背景 2、理论 3、操作 4、SPSSAU输出结果 5、文字分析 6、剖析 疑难解惑 数据如何录入? 如何…

Macintosh小电脑、小手机 | openKylin最新硬件创意形态首次亮相!

近期&#xff0c;OpenAtom openKylin&#xff08;简称 “openKylin”&#xff09;社区与嘉立创旗下的立创开发板团队展开深度技术合作&#xff0c;成功完成立创・泰山派1开发板与openKylin 2.0操作系统的兼容适配。5月24日&#xff0c;嘉立创“第三届开源硬件星火会”在深圳盛大…

基于Spring Boot的计算机考研交流系统的设计与实现

基于Spring Boot的计算机考研交流系统的设计与实现 随着计算机科学的发展&#xff0c;越来越多的学生选择考研来提高自己的专业水平。然而&#xff0c;考研的过程中&#xff0c;学生们面临着各种问题&#xff0c;如学习资料的获取、交流平台的缺乏等。为了更好地满足这些需求&…

技术逐梦之旅:从C语言到Vue的成长之路

董翔&#xff0c;一个对软件技术充满热忱的00后。从初次在屏幕上敲出"Hello World"的激动&#xff0c;到如今能够独立开发完整Web应用的从容&#xff0c;我的编程之路见证了技术的迭代与自我的蜕变。 作为软件专业的学生&#xff0c;我始终坚信"技术是解决问题…

Qt QMap数据清除测试(验证QMap内存正确释放方法)

环境 Qt C (msvc编译环境) 测试代码 //定义 动子信息 &#xff08;可放在.cpp文件 中&#xff09; struct MoverInfo{uint32_t ID;double PartPosition;uint16_t ModuleID;uint32_t PartID;uint32_t TrackID;uint32_t TrackID2; };//使用Windows任务管理器查看内存使用情况//…

【安全咨询】

安全咨询服务是一个专业领域&#xff0c;旨在帮助个人和组织识别、评估和管理各种安全风险&#xff0c;保护其人员、资产、信息和运营安全。 一、安全咨询 1.1 服务的核心目标 ​识别风险&#xff1a;​​ 发现潜在的、可能对组织或个人造成损害的威胁和漏洞。​评估威胁&am…

vue+elementUI实现固定table超过设定高度显示下拉条

解决方案&#xff1a; 在表格上添加了style"height: px;"和:max-height""&#xff0c;这两个设置共同作用使表格在内容超过 设定高度时显示滚动条配合css使用 高度值可根据实际需求调整 <el-table:data"biddData"style"width: 100%;…

UNet改进(5):线性注意力机制(Linear Attention)-原理详解与代码实现

引言 在计算机视觉领域&#xff0c;UNet架构因其在图像分割任务中的卓越表现而广受欢迎。近年来&#xff0c;注意力机制的引入进一步提升了UNet的性能。本文将深入分析一个结合了线性注意力机制的UNet实现&#xff0c;探讨其设计原理、代码实现以及在医学图像分割等任务中的应…

Unity技能编辑器深度构建指南:打造专业级战斗系统

本文为技术团队提供完整的技能编辑器开发指南&#xff0c;涵盖核心架构设计、资源管线搭建和协作工作流实现&#xff0c;帮助您构建专业级的战斗技能系统。 一、核心架构设计 1. 基础框架搭建 专用场景模板&#xff1a; 创建SkillEditorTemplate.unity场景 核心节点&#xff…

《游戏工业级CI/CD实战:Jenkins+Node.js自动化构建与本地网盘部署方案》

核心架构图 一、游戏开发CI/CD全流程设计 工作流时序图 二、Jenkins分布式构建配置 1. 节点管理&#xff08;支持Win/Linux/macOS&#xff09; // Jenkinsfile 分布式配置示例 pipeline {agent {label game-builder // 匹配带标签的构建节点}triggers {pollSCM(H/5 * * * *)…