《Qt 6 C++开发指南》--1.1 Qt 简介

《Qt 6 C++开发指南》--1.1 Qt 简介_第1张图片

1.1 Qt简介

很多刚接触Qt的开发者会认为Qt是一种编程语言,或者将Qt的集成开发环境(integrated development environment,IDE)Qt Creator当作Qt,这些理解是错误的。Qt实质上是用C++编写的大型类库,它为跨平台应用开发提供了一个完整的框架。Qt框架包含大量的类,支持GUI、数据库、网络、多媒体等各种应用的编程。本节概要介绍Qt的功能和特点,包括其跨平台开发能力、许可类型、支持的开发语言,以及Qt 6的新特性。

1.1.1 Qt的跨平台开发能力

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程序,搭建好交叉编译开发环境即可。

1.1.2 Qt的许可类型和安装包

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程序。

《Qt 6 C++开发指南》--1.1 Qt 简介_第2张图片

图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类库中的各种类的编程接口是一样的。

1.1.3 Qt支持的开发语言

1.C++和QML

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++。

2.Python

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开源许可对商业开发者更友好一些。

1.1.4 Qt 6新特性

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框架中的所有模块。

你可能感兴趣的:(Qt,Qt,6,C++开发指南,Qt,简介,Qt,6新特性)