- PySide 6/PyQt 6快速开发与实战
- 孙洋洋等
- 3825字
- 2023-02-28 20:16:55
1.1 PySide 6/PyQt 6框架简介
1.1.1 从GUI到PySide/PyQt
在目前的软件设计过程中,GUI的设计相当重要,美观、易用的用户界面能够在很大程度上提高软件的使用量,因此,许多软件的用户界面的设计需要花费大量的精力。
在介绍PySide/PyQt框架之前,先介绍什么是GUI。
GUI是Graphical User Interface的简称,即图形用户界面,准确地说,GUI就是屏幕产品的视觉体验和互动操作部分。GUI是一种结合计算机科学、美学、心理学、行为学及各商业领域需求分析的人机系统工程,强调将人、机、环境这三者作为一个系统进行总体设计。
Python最初是作为一门脚本语言开发的,并不具备GUI功能。但是,由于Python本身具有良好的可扩展性,能够不断地通过C/C++模块进行功能性扩展,因此目前已经有相当多的GUI控件集(Toolkit)可以在Python中使用。
在Python中经常使用的GUI控件集有PyQt、Tkinter、wxPython、Kivy、PyGUI和Libavg,其中PySide/PyQt是Qt官方专门为Python提供的GUI扩展。
Qt for Python旨在为PySide模块提供完整的Qt接口支持。Qt for Python于2015年5月在GitHub上开始开发,计划使PySide支持Qt 5.3、Qt 5.4和Qt 5.5。2016年4月,Qt官方正式为其提供接口支持。2018年6月中旬发布的技术预览版支持Qt 5.11,同年12月发布的正式版支持Qt 5.12。
2020年12月,PySide 6跟随Qt 6一起被发布,与旧版本相比该版本有以下不同之处。
(1)不再支持Python 2.7。
(2)放弃对Python 3.5的支持,最低支持到Python 3.6+(最高支持Python 3.9)
Qt for Python在LGPLv3/GPLv2和三大平台(Linux、Windows、macOS)的商业许可下可用。
截至本书完稿之时,PySide 6/PyQt 6的最新版本是6.2.3,这个版本和Qt的最新版本一致,由此可见,Python Qt的同步速度是非常快的。PySide 6/PyQt 6是Python下为数不多的非常好用的GUI,可以在Python中调用Qt的图形库和控件。
PySide 6/PyQt 6是Python对Qt框架的绑定。Qt是挪威的Trolltech(奇趣科技公司)使用C++开发的GUI应用程序,包括跨平台类库、集成开发工具和跨平台IDE,既可以用于开发GUI程序,也可以用于开发非GUI程序。使用Qt只需要开发一次应用程序,便可跨不同桌面和嵌入式系统部署该应用程序,而无须重新编写源代码。和Python一样,Qt也具有相当优秀的跨平台特性,使用Qt开发的应用程序能够在Windows、Linux和macOS这三大平台之间轻松移植。
开源软件需要解决的最大问题是如何处理开发人员使用开源软件来完成个人或商业目标,其中包括版权与收益的问题。当一个软件开发人员打算将自己写的代码开源时,通常选择自由软件协议,即GPL(GNU General Public License,GNU通用公共许可证)协议。因此,PySide 6/PyQt 6选择了GPL协议,开发人员可以放心使用PySide 6/PyQt 6开发软件。
GPL协议:软件版权属于开发人员本人,软件产品受国际相关版权法的保护。允许其他用户对原作者的软件进行复制或发行,并且可以在更改之后发行自己的软件。发布的新软件也必须遵守GPL协议,不得对其进行其他附加的限制。在GPL协议下不存在“盗版”的说法,但用户不能将软件据为己有,如申请软件产品“专利”等,因为这将违反GPL协议并且侵犯了原作者的版权。
本书主要以PySide 6为例进行讲解,在提供PySide 6代码的同时也会提供一份PyQt 6代码。
1.1.2PySide 6/PyQt 6的进展
2020年12月,PySide 6跟随Qt 6一起发布,这时就可以使用Python Qt 6模块。但是Qt 6还不够完善,所以Qt官方于2021年4月发布了Qt 6.1,并于2021年9月底发布了Qt 6.2 LTS,这是Qt 6的第一个LTS版本,也是比较完善的版本。
Qt 6支持的模块如表1-1所示。
表1-1 Qt 6支持的模块
Qt 6.1将在Qt 6的基础上增加如表1-2所示的模块。
表1-2 Qt 6.1在Qt 6的基础上增加的模块
Qt 6.2又在Qt 6.1的基础上增加了如表1-3所示的模块。
表1-3 Qt 6.2在Qt 6.1的基础上增加的模块
由此可知,Qt 6.2是比较完善的版本,这也是本书的主要内容围绕PySide 6展开介绍的原因。有一些模块没有在表1-1~表1-3中列出,这是因为:有的模块可能已经从Qt 6中删除,如Qt KNX、Qt Script和Qt XML Patterns等;有的模块被合并成其他模块的一部分,不再需要作为单独的模块,如特定于平台的附加功能;有的模块是在Qt 6.2 LTS之后发布的或通过Qt Marketplace提供的;有的模块并不是Qt框架的一部分,如Qt Safe Renderer、Qt Automotive Suite等。
如果读者想查看更多关于Qt的资料,则可以参考Qt官方网站。
Qt自从问世以来就受到了业界的广泛欢迎。在《财富》全球500强企业排行榜中,前10家企业中有8家在使用Qt开发软件。
每当Qt 6的版本进行更新时,PySide 6/PyQt 6也会随时跟进更新。PySide 6/PyQt 6严格遵循Qt的发布许可,拥有双重协议,开发人员可以选择使用免费的GPL协议,如果要将它们用于商业活动,则必须为此交付商业许可费用。
PySide 6/PyQt 6正受到越来越多的Python程序员的喜爱,这是因为它们具有如下几方面特性。
• 基于高性能的Qt的GUI控件集。
• 能够跨平台运行在Windows、Linux和macOS等平台上。
• 使用信号/槽机制进行通信。
• 对Qt库进行完全封装。
• 可以使用Qt成熟的IDE(如Qt Designer)进行图形界面设计,并且自动生成可以执行的Python代码。
• 提供了一整套种类繁多的窗口控件。
1.1.3PySide/PyQt相对于Qt的优势
首先,PySide/PyQt都是简单易学且功能强大的框架。PySide/PyQt作为Qt框架的Python语言实现,为程序员提供了完整的Qt应用程序接口的函数,几乎可以使用Python做任何Qt能做的事情。PySide/PyQt使用Qt中的信号/槽机制在窗口控件之间传递事件和消息非常方便。不同于其他图形界面开发库所采用的回调(Callback)机制,使用信号/槽机制可以使程序更加安全。
其次,在运行效率上,由于PySide/PyQt的底层是Qt的dll文件,也就是说,底层是基于C++运行的,所以可以在一定程度上保证程序开发的性能。
再次,PySide/PyQt可以充分发挥Python的语法优雅、开发快速的优势。Python相对于C++的优点是编程效率高,在标准的Qt例子移植到PyQt后,虽然代码具有相同的功能,也使用相同的应用程序接口,但Python版本的代码只有原来的50%~60%,并且更容易阅读。在开发效率上,Python是一种面向对象的语言,语法简单。相对于C++而言,使用Python编写程序可以降低开发成本。另外,可以借助Qt Designer进一步降低GUI开发的难度,减少代码量,提高开发效率。
最后,PySide/PyQt既可以使用Qt的生态,也可以使用Python自己的生态。例如,Python在人工智能、大数据、可视化绘图等方面都有非常成熟的开源项目,这些项目使用起来非常容易,结合PySide/PyQt可以快速开发出具有生产力的作品。
1.1.4PySide 6/PyQt 6与PySide 2/PyQt 5的关系
PySide 6/PyQt 6都基于Qt 6,它们之间的代码基本上没有区别;PySide 2/PyQt 5都基于Qt 5,它们之间的代码也基本上没有区别。Qt 6能够向下兼容Qt 5,因此,对于绝大部分应用来说,PySide 6/PyQt 6和PySide 2/PyQt 5的代码是可以通用的。也就是说,以下4行代码一般可以相互替换:
但是它们之间还是有细微的区别的,初学者最关心的可能是PySide 6/PyQt 6之间的区别。下面介绍PySide 6/PyQt 6之间的两个最重要的区别,掌握这两个最重要的区别基本上就可以帮助开发人员解决PySide 6/PyQt 6之间约95%的兼容性问题。
一是信号与槽的命名,PySide 6和PyQt 6关于信号与槽的命名不同,使用下面的方法可以统一起来:
二是关于枚举的问题。PySide 6为枚举的选项提供了快捷方式,如Qt.DayOfWeek枚举包括星期一到星期日的7个值,在PySide中星期三可以直接用Qt.Wednesday表示,而在PyQt 6中需要完整地使用Qt.DayOfWeek.Wednesday表示。当然,在PySide 6中使用Qt.DayOfWeek.Wednesday也不会出错。在PySide 6中可以使用快捷方式,但在PyQt 6中不可以使用快捷方式。为了解决这个问题,最简单的方法是从Qt官方的帮助文档中查询枚举的完整路径,如图1-1所示。
另一个方法是使用qtpy模块。使用qtpy模块可以把PySide和PyQt统一起来,假设在Python环境下只安装了PyQt 6和qtpy模块,没有安装PySide等,该环境就会为PyQt 6的枚举添加快捷方式,简单来说就是通过以下方式导入的Qt模块可以直接使用Qt.Wednesday:
图1-1
1.1.5 PyQt 5与PyQt 4
对于Qt 4和Qt 5来说,Python Qt主要使用PyQt 4和PyQt 5。
PyQt 5不再向下兼容使用PyQt 4编写的程序,因为PyQt 5有如下几个较大的变化。
(1)PyQt 5不再为Python 2.6以前的版本提供支持,而对Python 3的支持比较完善,官方默认只提供Python 3版本的安装包,如果需要使用Python 2.7,则需要自行编译PyQt 5程序。
(2)PyQt 5对一些模块进行了重新构建,一些旧的模块已经被舍弃,如PyQt 4的QtDeclarative模块、QtScript模块和QtScriptTools模块;一些模块被拆分到不同的模块中,如PyQt 4的QtWebKit模块被拆分到PyQt 5的QtWebKit模块和QtWebKitWidgets模块中。
(3)PyQt 5对网页的支持是与时俱进的。PyQt 4的QtWebKit模块是Qt官方基于开源的WebKit引擎开发维护的,但是由于WebKit引擎的版本比较老,因此对互联网的新生事物,尤其是对JavaScript的支持不是很完美;PyQt 5所使用的QtWebEngineWidgets模块(PyQt 5.7以上版本)是基于Google团队开发的Chromium内核引擎开发和维护的,该内核引擎更新维护的速度很快,基本上可以完美地支持互联网的新生事物。
(4)PyQt 5仅支持新式的信号与槽,对旧式的信号与槽的调动不再支持,新式的信号与槽使用起来更简单。
(5)PyQt 5不支持在Qt 5.0中标记为已放弃或过时的Qt API部分。
(6)PyQt 5在程序需要时才释放GIL,而PyQt 4是执行完程序后强制释放GIL。
1.1.6 其他图形界面开发库
自Python诞生之日起,就有许多GUI工具集被整合到Python中,使Python也可以在图形界面编程领域大显身手。由于Python的流行,许多应用程序都是用Python结合这些GUI工具集编写的。下面分别介绍Python GUI编程的各种实现。
1.Tkinter
Tkinter是绑定了Python的Tk GUI工具集,就是Python包装的Tcl代码,通过内嵌在Python解释器内部的Tcl解释器实现。先将Tkinter的调用转换为Tcl命令,然后交由Tcl解释器进行解释,使用Python实现GUI设计。Tk和其他语言的绑定,如PerlTk,是直接由Tk中的C库实现的。
Tkinter是Python事实上的标准GUI,在Python中使用Tk GUI工具集的标准接口,已经包含在Python Windows安装程序中,IDLE就是使用Tkinter实现GUI设计的。
2.wxPython
wxPython是Python对跨平台的GUI工具集wxWidgets(用C++编写)的包装,作为Python的一个扩展模块来实现。wxPython是Tkinter的一个替代品,在各种平台上的表现都很好。
3.PyGTK
PyGTK是Python对GTK+GUI库的一系列包装,也是Tkinter的一个替代品。GNOME下许多应用程序的GUI都是使用PyGTK实现的,如BitTorrent、GIMP等。
在上面的图形界面开发库中,都没有类似于Qt Designer(UI工具可以通过可视化操作创建.ui文件,并通过工具快速编译成Python文件,因此,也可以把它视为一个代码生成器)的工具,所有的代码都需要手动输入,学习曲线非常陡峭,并且这几个GUI框架远没有Qt的生态成熟与强大。所以,对于Python使用者来说,使用PySide/PyQt进行GUI开发是最好的选择,这也是笔者介绍PySide 6/PyQt 6的原因。