很多刚接触Qt的开发者会认为Qt是一种编程语言,或者将Qt的集成开发环境(integrated development environment,IDE)Qt Creator当作Qt,这些理解是错误的。Qt实质上是用C++编写的大型类库,它为跨平台应用开发提供了一个完整的框架。Qt框架包含大量的类,支持GUI、数据库、网络、多媒体等各种应用的编程。本节概要介绍Qt的功能和特点,包括其跨平台开发能力、许可类型、支持的开发语言,以及Qt 6的新特性。
Qt的一个重要特点就是具有跨平台开发能力。我们可以使用Qt为计算机、移动设备、嵌入式设备、微控制单元(microcontroller unit,MCU,又称单片机)等目标设备开发程序。Qt能用于如下一些设备和平台的应用开发。
桌面应用开发,支持的桌面操作系统包括Windows、桌面Linux和macOS。
手机和平板计算机等移动设备的应用开发,支持的移动操作系统包括Android、iOS和Windows。
嵌入式设备的应用开发,支持的嵌入式操作系统包括QNX、嵌入式Linux和VxWorks等。这些嵌入式设备一般具有能力较强的处理器和丰富的存储器资源,例如轿车的全液晶仪表盘。
MCU的应用开发,支持嵌入式实时操作系统FreeRTOS或无操作系统。MCU的处理器能力较弱,存储器资源有限,各种MCU系统的硬件资源差异大,目前Qt只支持NXP、Renesas、ST、Infineon等公司的部分型号单片机开发板,实际产品的开发需要深度定制。
以上介绍的这些设备和操作系统称为目标平台,是运行用Qt开发的应用软件的平台。实际上,除了计算机和服务器,其他设备都可以归为嵌入式设备,嵌入式设备的软件开发需要使用交叉编译开发方式。因为嵌入式设备的硬件和软件资源有限,所以不能直接在嵌入式设备上进行软件开发,而是需要先在计算机上编写源程序,然后使用针对目标平台的编译器编译代码,再将编译出的二进制文件下载到目标设备上运行。例如我们为STM32单片机开发程序时,就是在计算机上用开发软件编写并编译程序,然后将编译好的二进制文件通过仿真器下载到STM32单片机上运行。
在交叉编译开发方式中,计算机称为主机,主机包括Windows、桌面Linux、macOS等不同的主机平台,Qt提供了安装在这3种主机平台上的对应版本。要针对某个目标平台开发应用,必须使用对应主机平台的Qt。例如,要开发在Windows计算机上运行的应用,就必须使用Windows平台上的Qt;要开发在苹果手机(iOS)上运行的应用,就必须使用苹果计算机(macOS平台)上的Qt。Qt的目标平台和主机平台的对应关系如表1-1所示。
表1-1 Qt的目标平台和主机平台的对应关系
目标设备 |
目标平台 |
主机平台 |
计算机 |
桌面Linux |
桌面Linux |
macOS |
macOS |
|
Windows |
Windows |
|
移动设备 |
Android |
桌面Linux、macOS、Windows |
iOS |
macOS |
|
手机Windows |
Windows |
|
嵌入式设备 |
嵌入式Linux |
桌面Linux |
QNX |
桌面Linux、Windows |
|
VxWorks |
桌面Linux、Windows |
|
嵌入式Windows |
Windows |
|
单片机 |
FreeRTOS或无操作系统 |
Windows、桌面Linux |
在一个主机平台上编写的Qt项目的源代码,在另一个主机平台或目标平台上经过重新编译,就可以得到在不同目标平台上运行的应用软件,这就是Qt的跨平台开发能力。用Qt编写的源代码经过编译后是在目标平台上运行的原生二进制代码,不像Java代码那样需要用虚拟机来运行,所以具有很高的运行效率。
Qt为开发多平台版本的应用软件提供了极大的支持,很多应用软件是用Qt开发的,例如WPS Office就是用Qt开发的,它有在Windows、macOS和Linux系统上运行的桌面版本,也有在iOS和Android系统上运行的移动版本。
熟悉了Qt框架的开发方法后,我们就可以为不同设备开发程序,不仅使用方便,还可以降低学习的时间成本。例如,用Qt开发桌面GUI程序的方法同样适用于用Qt为手机、嵌入式设备和MCU开发GUI程序,搭建好交叉编译开发环境即可。
Qt的许可类型分为商业许可和开源许可,开源许可又分为GPLv2/GPLv3和LGPLv3。各种许可协议的主要特点如下。
(1)商业许可。商业许可需要付费,Qt公司目前采用的是按年付费的方式。商业许可允许开发者不公开项目的源代码。商业许可的Qt安装包里有更多的模块,某些模块只有在商业许可的版本中才有。
(2)开源许可。
GPLv2/GPLv3许可。若用户编写的程序使用了GPL许可的Qt代码,则用户程序也必须使用GPL许可,也就是用户代码必须开源,但是允许商业化销售。GPLv3还要求用户公开相关硬件信息。
LGPLv3许可。若用户对使用LGPL许可的Qt代码进行修改后予以发布,则用户发布的代码必须遵循LGPL许可,也就是用户代码必须开源,但是允许商业化销售。若用户编写的程序只是以库的形式链接或调用了使用LGPL许可的Qt代码,则用户代码可以闭源,也可以商业化销售。
在开源许可协议中,LGPL相对于GPL更宽松一些。若用户程序只是链接或调用LGPL许可协议的Qt代码,那么用户代码可以闭源;而用户程序只要用到了使用GPL许可协议的Qt代码,用户代码就必须开源。
Qt的安装包、工具软件、开发框架中的不同模块都有各自的许可类型。若用户开发的代码可以开源,就可以放心使用Qt中各种开源许可的工具软件和模块;若用户不想公开自己的源代码,就不能使用GPL许可的Qt模块,使用LGPL许可的模块时要注意只能以库的形式链接或调用。
根据开发目标的不同,Qt提供了3种安装包。安装包具有针对不同主机平台的版本,而且采用了不同的许可协议。
Qt for Application Development:用于为计算机和移动设备开发应用的开发套件安装包,有商业和开源两种许可协议,具有Windows、Linux、macOS主机平台版本。
Qt for Device Creation:用于为嵌入式设备开发应用的开发套件安装包,只有商业许可协议,具有Windows和Linux主机平台版本。
Qt for MCUs:用于为MCU开发GUI程序的开发套件安装包,只有商业许可协议,具有Windows和Linux主机平台版本。图1-1是Qt for MCUs在STM32F769开发板上的示例的运行画面,在单片机上也可以开发类似于智能手机应用的GUI程序。
图1-1 Qt fot MCUs在STM32F769开发板上的运行画面示例
Qt for Device Creation和Qt for MCUs只有商业许可版本,但是可以申请免费试用版本。嵌入式设备和MCU的软件开发定制性很强,需要根据具体硬件设计驱动程序,即使是专业的开发人员也可能需要Qt公司的专业技术支持才可以完成开发工作。
Qt for Application Development有开源许可版本,具有Windows、Linux、macOS主机平台版本,可以开发桌面应用,也可以开发手机或平板计算机的应用。Qt的初学者使用这个版本较合适。本书重点介绍使用Windows版本的Qt,并主要介绍用C++开发Windows桌面应用。读者可在学会这些之后,再开发Linux和macOS的桌面应用,方法是类似的。若要开发嵌入式设备的GUI程序,搭建好交叉编译开发环境即可,Qt类库中的各种类的编程接口是一样的。
Qt类库本身是用C++语言编写的,所以Qt支持的基本开发语言是C++。Qt还对标准C++语言进行了扩展,引入了信号与槽、属性等机制,为跨平台和GUI程序的对象间通信提供了极大的方便。
Qt还提供了一种自创的编程语言QML,它是类似于JavaScript的声明性语言。Qt提供了一个用QML编写的库Qt Quick,它类似于Qt C++类库,区别是Qt Quick中的各种控件被称为QML类型(type)。QML用于描述程序的用户界面,将用户界面描述为对象树,每个对象具有自己的各种属性。
QML适合为支持触摸屏操作的设备创建用户界面,这些设备如手机、嵌入式设备和MCU。用QML创建的用户界面具有现代感很强的界面显示和操作效果。还可以混合使用QML和C++编程,也就是用QML创建用户界面,用C++处理后台业务逻辑。
Qt的3种安装包都支持QML,Qt for MCUs目前不支持C++,只支持QML。因为MCU的资源有限,所以Qt for MCUs支持的是一个轻量化的QML控件库Qt Quick Ultralite。使用QML为MCU创建界面的代码会被转换为C++代码,MCU底层开发使用嵌入式C/C++。
Qt C++类库可以被转换为Python绑定,我们可以用Python语言编程调用Qt类库进行GUI程序开发。Qt类库的Python绑定版本比较多,比较常用的是PyQt和PySide。
PyQt是RiverbankComputing公司开发的Qt类库的Python绑定,它出现得比较早,更新比较及时,是目前应用比较广泛的Qt类库的Python绑定。PyQt5是与Qt 5对应的版本,PyQt6是与Qt 6对应的版本。PyQt5和PyQt6都采用商业许可和GPLv3开源许可。
Qt for Python是Qt官方的一个项目,它产生的Qt类库的Python绑定是PySide2和PySide6。PySide2是Qt 5的Python绑定。为了与Qt的版本对应,Qt 6的Python绑定被直接命名为PySide6。其实最早的PySide1在2009年就推出了,对应Qt 4。但是Nokia公司将Qt卖给Digia公司后,PySide1缺少维护和更新,没有及时发布Qt 5对应的版本,所以很长一段时间里PyQt5的知名度更高。
2015年,Qt官方又开始重视Qt for Python项目,开始开发与Qt 5对应的PySide。2018年12月,对应Qt 5.12的PySide2正式发布。2020年12月,Qt 6.0发布的同时,对应Qt 6的PySide6也正式发布。现在PySide2和PySide6都能分别紧跟Qt 5和Qt 6的版本更新。
PySide采用商业许可和LGPLv3开源许可,相对于PyQt采用的GPLv3开源许可,LGPLv3开源许可对商业开发者更友好一些。
Qt 5.0是在2012年发布的,经过多年的发展,Qt 5取得了巨大的成功。但是随着IT的发展,Qt 5的某些功能需要进行更新,例如C++语言标准已经发展到C++17,而Qt 5还是基于C++98标准。对Qt 5的简单修补已无法满足更新要求,所以诞生了Qt 6,它对Qt的一些底层进行了重大的更新,又尽量保持与Qt 5兼容。
Qt 6.0在2020年12月正式发布,它引入了很多新的特性,主要包括如下内容。
支持C++ 17标准。Qt 6要求使用兼容C++17标准的编译器,以便使用一些C++语言的新特性。
Qt核心库的改动。设计了新的属性和绑定系统;字符串全面支持Unicode;修改了QList类的实现方式,将QVector类和QList类统一为QList类;QMetaType和QVariant是Qt元对象系统的基础,这两个类在Qt 6中几乎被完全改写。
新的图形架构。Qt 5中的3D图形API依赖OpenGL,但是现在的技术环境发生了很大的变化。在Linux平台上,Vulkan逐渐取代OpenGL,苹果公司主推其Metal,Microsoft公司则使用Direct 3D。为了使用不同平台上的3D技术,Qt 6中设计了3D图形的渲染硬件接口(rendering hardware interface,RHI)。RHI是3D图形系统的一个抽象层,使得Qt可以使用平台本地化的3D图形API。
CMake构建系统。Qt 6支持CMake构建系统,并且建议新的项目使用CMake,Qt 6本身就是用CMake构建的。但是Qt公司声明,Qt 6仍然会在整个生命周期内支持qmake构建系统。
Qt 6还有许多其他方面的改进,例如对多媒体、网络、Qt Quick 3D等模块的改进,感兴趣的读者可以查看Qt官网上的相关博客文章。Qt 6尽量与Qt 5保持兼容,将Qt 5的项目程序移植到Qt 6一般只需少量的改动,Qt官网上有关于移植到Qt 6的技术指导。
Qt 6发布后,Qt 5仍然在更新。Qt 5.15是Qt 5系列的最后一个LTS版本,如果用户不愿意升级到Qt 6,使用Qt 5.15 LTS是比较好的选择。
Qt 6.0在发布时并不包含Qt5.15中的所有模块,在后续发布的版本中又逐渐增加模块。Qt 6.1在2021年5月发布,增加了Charts、Data Visualization等模块。Qt 6.2在2021年9月发布,增加了Bluetooth、Multimedia、Serial Port等模块。Qt 6.2是Qt 6系列的第一个LTS版本,它补齐了Qt框架中的所有模块。