《探秘 QT 5.14.1 类库的奇妙世界》
《探秘 QT 5.14.1 类库的奇妙世界》
- 一、QT 5.14.1 类库简介
- 1.1 跨平台特性
- 1.2 整体框架构成
- 二、核心特点剖析
- 2.1 元对象系统
- 2.2 信号与槽的关联方式
- 2.3 全局定义
- 2.3.1 数据类型定义
- 2.3.2 函数
- 2.3.3 宏定义
- 三、常用类库功能展示
- 3.1 QWidget 类库
- 3.2 其他重要类库(按需选取部分介绍)
- 3.2.1 Qt Core 模块
- 3.2.2 Qt GUI 模块
- 3.2.3 Qt Multimedia 模块
- 四、QT 5.14.1 新功能亮点
- 4.1 各模块新特性
- 4.1.1 Qt 3D 模块
- 4.1.2 Qt 蓝牙模块
- 4.1.3 Qt 核心模块
- 4.1.4 Qt GUI 模块
- 4.1.5 Qt 多媒体模块
- 4.1.6 Qt 网络模块
- 4.1.7 Qt QML 模块
- 4.1.8 Qt 快速模块
- 五、QT 5.14.1 类库的应用场景
- 5.1 图形用户界面(GUI)应用开发
- 5.2 网络应用程序开发
- 5.3 嵌入式应用程序开发
一、QT 5.14.1 类库简介
1.1 跨平台特性
QT 5.14.1 作为一款跨平台应用程序开发框架,具备诸多显著优势。它能够让开发者使用相同的代码,在不同的操作系统上运行应用程序,例如常见的 Windows、macOS、Linux 等操作系统,甚至还能覆盖到 Android 和 iOS 等移动端操作系统。
其跨平台能力体现在提供了一致的 API(应用程序编程接口),开发人员在 Windows 系统上使用的 API,与在 Linux 或者 macOS 系统上使用的 API 保持高度一致性。这就意味着代码的移植变得轻而易举,无论在何种平台进行开发,都无需对代码结构做大规模改动,大大降低了开发的复杂程度。并且,在维护应用程序时,也只需针对同一套代码进行维护,避免了为不同平台分别维护代码所带来的巨大工作量,从而节省了大量的开发和维护成本。
此外,QT 5.14.1 还拥有丰富的功能集,涵盖了图形渲染、多媒体、网络通信、数据库访问等多个方面。开发人员借助这些功能,可以更高效地开发出功能丰富多样的应用程序,无需再从头开始去自行实现这些复杂的功能,进一步加快了开发的进程,提升了开发效率。
1.2 整体框架构成
QT 5.14.1 类库的整体框架由多个不同类型的模块共同构成。
首先是基本模块(Qt Essentials),它提供了 QT 在所有平台上的基础性功能,是整个类库的核心支撑部分,像 Qt Core 模块就是 Qt 类库的核心所在,其他所有模块都依赖于此模块,在使用 qmake 构建项目时,Qt Core 模块会自动被加入项目中;Qt GUI 模块则包含了用于开发图形用户界面(GUI)应用程序的必要类,若使用 qmake 构建应用程序,该模块也会自动被加入项目,不过要是项目中不涉及 GUI 功能,就需要在项目配置文件中加入 “QT -= gui” 来排除它;还有 Qt Multimedia 模块提供了音频、视频、摄像头以及广播功能相关的各类类库,Qt Network 模块能让网络编程变得更加简单轻便,Qt SQL 模块可用于数据库操作等等,这些基本模块共同保障了应用程序在各平台上基本功能的实现。
其次是附加模块(Qt Add-Ons),这类模块主要用于实现一些特定功能,从而为开发增添附加价值。例如 Active Qt 模块可用于开发使用 ActiveX 和 COM 的 Windows 应用程序;Qt 3D 模块支持 2D 和 3D 渲染,能助力开发近实时仿真系统;Qt Android Extras 模块提供了 Android 平台相关的 API,方便针对安卓平台进行开发;Qt Bluetooth 模块则提供了访问蓝牙硬件的功能等等,不过这些附加模块可能只在特定的开发平台上存在,或者仅适用于某些操作系统,又或者是为了向后兼容而设置,用户在安装时可以根据自身需求选择性地进行安装。
除了上述模块之外,还有增值模块(Value-Add Modules),这类模块是单独发布的,往往带有额外的价值,不过通常只在商业版许可的 Qt 里才会出现;以及技术预览模块(Technology Preview Modules),它们处于开发阶段,可作为技术预览来使用,经过几个版本的迭代发布后有可能会转变为正式的模块;另外,Qt 工具(Qt Tools)也在整个框架中发挥着作用,能帮助开发人员更好地进行应用程序的开发与设计工作,例如 Qt Designer 就可用于扩展相关的设计类内容,方便开发人员进行界面设计等操作。
二、核心特点剖析
2.1 元对象系统
QT 5.14.1 的元对象系统是其框架中的一个核心机制,有着诸多重要组成部分及功能特性。
首先是 QObject 类,它作为 Qt 的所有类的基类,几乎所有使用元对象系统的类都必须继承自它。该类提供了对象树、对象间通信、信号和槽机制等基本功能,通过继承 QObject,类能够参与到 Qt 的内存管理系统中,并且支持元对象系统里的动态功能。
其次是 Q_OBJECT 宏,这是元对象系统的核心所在,其必须在继承自 QObject 的类中定义,通常位于类的声明部分。Q_OBJECT 宏会触发 Qt 的元对象编译器(Meta-Object Compiler,简称 MOC),由 MOC 生成用于支持信号与槽、属性系统等特性的代码,若缺少这个宏,类便无法使用信号与槽、属性等高级功能。
而 MOC(元对象编译器)作为关键的预处理器,会解析带有 Q_OBJECT 宏的类,并生成相应的元对象代码,以此确保信号与槽、属性系统等功能能够正常运作,它在 Qt 编译过程中起着不可或缺的作用。
再者就是元对象系统所提供的一系列功能,比如信号与槽机制,信号作为事件发生时自动触发的成员函数,本身不包含实际实现,仅是事件的声明;而槽则是一种普通的成员函数,专门用于处理信号的响应,二者可通过 QObject::connect () 来建立连接,当信号被触发时,所有与之连接的槽函数都会被自动调用。
另外,还有运行时类型信息功能,通过 qobject_cast() 可以在运行时将一个 QObject 指针转换为某个特定类型的指针,若对象类型匹配,则转换成功,这在多态编程和动态对象处理时非常实用。同时,动态属性系统允许开发者将类的成员变量公开为属性,方便在运行时进行动态访问和修改,属性可以使用 Q_PROPERTY 宏来定义,每个属性都配备有 getter 和 setter 函数,用于读写属性值,常用于 Qt 的 QML 和界面设计器工具,支持对象属性的绑定和更新。
2.2 信号与槽的关联方式
在 QT 5.14.1 中,信号与槽有着多种关联方式,不同的方式有着各自的特点、适用场景以及使用时需要注意的事项,下面为大家详细介绍。
- Qt::AutoConnection:这是默认的关联方式,其会根据 sender(信号发送者)和 receiver(信号接收者)所处线程在信号发出时作出判断。如果二者在同一线程则使用 Qt::DirectConnection
连接,否则使用 Qt::QueuedConnection 连接。需要注意的是,这里真正判断的是发出信号这个动作所在的线程,而非
sender 对象所处线程。 - Qt::DirectConnection:采用这种关联方式时,槽函数会在信号发送的时候直接被调用,并且槽函数运行于信号发送者所在线程,效果看上去就像是直接在信号发送位置调用了槽函数。不过要特别留意,在多线程环境下使用它比较危险,可能会造成程序崩溃的情况。
- Qt::QueuedConnection:当以此方式关联信号与槽时,槽函数在控制回到接收者所在线程的事件循环时才会被调用,槽函数运行于信号接收者所在线程。也就是说,发送信号之后,槽函数不会立刻被调用,而是要等到接收者的当前函数执行完,进入事件循环之后,槽函数才会被调用,在多线程环境下一般会采用这种方式。
- Qt::BlockingQueuedConnection:该关联方式下槽函数的调用时机与 Qt::QueuedConnection 一致,不过发送完信号后发送者所在线程会阻塞,直到槽函数运行完,在多线程间需要同步的场合可能会用到它。但务必注意,接收者和发送者绝对不能在一个线程,否则程序将会出现死锁的问题。
除此之外,还有 Qt::UniqueConnection,这个可以通过按位或(|)与上述四个结合在一起使用,当设置了这个 flag 时,若某个信号和槽已经连接,再进行重复的连接就会失败,也就是能够避免重复连接的情况出现。
2.3 全局定义
2.3.1 数据类型定义
在 QT 5.14.1 中,为了确保在各个平台上各数据类型都有统一确定的长度,头文件里为常见数据类型定义了类型符号。例如,qint8 就是 signed char 的类型定义,即 typedef signed char qint8,其在 Qt 支持的所有平台上都保证是 8 位的。还有 qint16 对应 signed short,qint32 对应 signed int,qint64 对应 long long int 等等。另外,quint8 表示 unsigned char,quint16 表示 unsigned short,quint32 表示 unsigned int,quint64 表示 unsigned long long int。qreal 缺省是 8 字节 double 类型浮点数,如果 Qt 使用 -qreal float 选项进行配置,就是 4 字节 float 类型的浮点数,而 qfloat16 是 Qt 5.9.0 中新增的一个类,用于表示 16 位的浮点数,使用它时需要包含头文件。这些定义好的数据类型在跨平台开发中,能让开发者不必担心因平台差异导致的数据类型长度不一致问题,方便进行各种数据处理操作。
2.3.2 函数
头文件还包含了一些常用函数的定义,这些函数多以模板类型作为参数,返回相应的模板类型,模板类型可以用任何其他类型替换。比如 qAbs (const T &value) 函数,它的功能是返回变量 value 的绝对值;qBound (const T &min, const T&value, const T &max) 函数能够返回 value 限定在 min 至 max 范围之内的值;qFuzzyIsNull (double d) 函数则用于判断参数 d 是否约等于 0,如果约等于 0 则返回 true。再如 qMax (const T&value1, const T&value2) 会返回 value1 和 value2 中较大的值,qMin (const T&value1, const T&value2) 会返回二者中较小的值。另外还有像 qRound64 (double value) 函数可以将 value 近似为最接近的 qint64 整数,qRound (double value) 函数能将 value 近似为最接近的 int 整数等等,这些函数在不同的业务逻辑处理中都发挥着重要作用,帮助开发者更便捷地实现各类数值计算和处理需求。
2.3.3 宏定义
头文件中定义了很多实用的宏,以下是一些常用的宏及其各自的含义和应用场景介绍。
- QT_VERSION:这个宏展开为数值形式 0xMMNNPP (MM = major, NN = minor, PP = patch),用于表示 Qt 编译器版本,例如 Qt 编译器版本为 Qt 5.9.1,则 QT_VERSION 为
0x050901。它常用于条件编译设置,开发者可以根据 Qt 版本不同,编译不同的代码段,以此来确保代码在不同版本的 Qt
上都能正确编译和运行,还能利用新版本的功能,同时保持对旧版本的兼容性。 - QT_VERSION_CHECK:该宏展开为 Qt 版本号的一个整数表示,通过比较 QT_VERSION(当前编译环境中的 Qt 版本)与 QT_VERSION_CHECK 宏生成的版本号,可以决定编译时包含哪些头文件或执行哪些代码,方便在编写代码时针对不同的 Qt
版本进行差异化处理。 - QT_VERSION_STR:其会展开为 Qt 版本号的字符串,如 “5.9.0”,便于在代码中直观地展示当前使用的 Qt 版本信息。
- Q_BYTE_ORDER、Q_BIG_ENDIAN 和 Q_LITTLE_ENDIAN:Q_BYTE_ORDER 表示系统内存中数据的字节序,Q_BIG_ENDIAN 表示大端字节序,Q_LITTLE_ENDIAN 表示小端字节序。在需要判断系统字节序时会用到,比如在跨平台开发、网络通信以及读写某些文件格式时,了解字节序差异并依据其进行相应处理非常关键,像在处理网络协议或与其他系统交换数据时,就需要正确处理字节序差异,以确保数据的正确解析。
- Q_DECL_IMPORT 和 Q_DECL_EXPORT:这两个宏在使用或设计共享库时发挥作用,用于导入或导出库的内容,方便在共享库相关的开发场景中进行符号的管理。
- Q_DECL_OVERRIDE:在类定义中,若要重载一个虚函数时可以使用这个宏,使用了此宏的话,如果重载的虚函数未进行任何重载操作,编译器将会报错,有助于提高代码的规范性和可读性。
- Q_DECL_FINAL:该宏可将一个虚函数定义为最终级别,意味着此虚函数不能再被重载,或者可以用它定义一个类使其不能再被继承,在对类和函数的继承限制方面提供了一种有效的控制手段。
- Q_UNUSED(name):常用于函数中定义那些不在函数体里使用的参数,这样可以避免编译器发出参数未使用的警告,同时也能保留有意义的参数名,为代码可能的后续更改保留接口。
- foreach(variable, container):用于容器类的遍历,虽然在 C++11 中有了标准库 for 循环可替代它,但在 Qt 开发中使用它仍能以一种简洁的方式来实现对 QList、QVector 等容器的遍历操作。
- forever:用于构造一个无限循环,等同于 for (;😉 的写法,在某些特定的业务逻辑需要持续执行的场景下会用到。
- qDebug(const char * message,…):主要用于在 debugger 窗体显示信息,如果编译器设置了 Qt_NO_DEBUG_OUTPUT,则不会有任何输出,类似的宏还有 qWarning、qCritical、qFatal、qInfo
等,它们都可帮助开发者在调试程序过程中输出相应信息,便于定位和解决问题。
三、常用类库功能展示
3.1 QWidget 类库
QWidget 在 Qt 中处于十分基础且重要的地位,它是所有窗口、对话框以及控件的基类。之所以说它是最基本的 GUI 类,是因为众多可视化组件都直接或间接继承自它,像我们常见的 QMainWindow、QDialog 等都是基于 QWidget 构建而来。
从功能角度来看,QWidget 提供了多方面实用的功能。在绘图方面,它作为 QPaintDevice 的子类,子类可以通过重写 paintEvent () 函数来实现自定义的绘图逻辑,在这个函数里利用 QPainter 类实例执行一系列绘制操作,从而能够在窗口上绘制出各种各样的形状、图像以及文本内容,例如开发者可以通过自定义绘制逻辑来绘制出具有独特样式的按钮、图表等图形元素。
在处理按键和鼠标事件上,QWidget 可以响应诸如鼠标点击、鼠标移动、键盘按键按下等各类用户输入事件。开发者通过重写对应的事件处理函数,比如 mousePressEvent ()(鼠标按下事件)、mouseReleaseEvent ()(鼠标释放事件)、keyPressEvent ()(键盘按键按下事件)等,就能实现符合项目需求的自定义交互逻辑,让界面能够根据用户的操作做出相应反馈。
而对于管理布局和界面,QWidget 既可以作为单独的窗口进行展示,也能充当容器组件来包含其他子控件,以此构建出复杂多样的用户界面。并且可以结合布局管理器(像 QHBoxLayout、QVBoxLayout 等)来精准控制子控件的位置和大小,实现灵活多变的界面布局效果,满足不同应用场景下对于界面呈现的要求。
以下是一个简单的示例代码,展示如何使用 QWidget 类创建一个基本的窗口:
#include <QWidget>
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
// 创建一个QWidget对象实例,作为窗口
QWidget widget;
// 设置窗口的标题
widget.setWindowTitle("My First Qt Window");
// 设置窗口的大小,这里设置宽度为400像素,高度为300像素
widget.resize(400, 300);
// 显示窗口
widget.show();
return app.exec();
}
通过这段代码,我们能够创建出一个简单的、带有标题且尺寸确定的窗口,这只是 QWidget 基础应用的一个小示例,在实际项目中,基于它能开发出功能更丰富、界面更复杂的 GUI 应用程序。
3.2 其他重要类库(按需选取部分介绍)
3.2.1 Qt Core 模块
Qt Core 作为 Qt 类库的核心所在,是其他模块依赖的基础,它提供了诸多核心的非图形类功能,为整个 Qt 应用程序框架奠定了坚实基础。
在对象通信方面,它具备强大的信号和槽机制,通过 QObject::connect () 函数可以便捷地建立对象间信号与槽的关联,使得对象在特定事件发生(即信号被触发时)能够自动调用对应的处理函数(槽函数),这种机制极大地方便了不同组件间的交互通信,让程序的逻辑解耦更加清晰,例如在一个按钮点击时触发对应的业务逻辑处理函数就是利用这一机制实现的。
同时,它还支持可查询和可设计的对象属性,开发者可以利用 Q_PROPERTY 宏来定义类的属性,并且通过相应的 getter 和 setter 函数(或者使用 QObject::setProperty () 和 QObject::property () 函数)在运行时动态地访问和修改属性值,常用于 Qt 的 QML 和界面设计器工具中,方便实现对象属性的绑定和更新等操作。
另外,Qt Core 模块提供了组织的层次化和可查询的对象树结构,方便对对象进行管理以及内存的自动管理(当父对象被销毁时,其子对象也会随之被自动销毁)。还有像跨库边界的动态转换、线程和并发编程相关的类和机制,能够帮助开发者更轻松地实现多线程应用开发,在不影响用户界面响应的情况下执行耗时操作,提升程序的整体性能和用户体验。
3.2.2 Qt GUI 模块
Qt GUI 模块主要聚焦于 GUI 界面开发相关功能,是开发图形用户界面(GUI)应用程序必不可少的部分。
它涵盖了丰富的图形绘制类和函数,能够实现 2D 图形的绘制,比如绘制线条、矩形、圆形等各种基本图形以及复杂的图形组合,为开发者打造出美观、直观的界面提供了有力支持。同时,在处理图像显示方面也提供了相应的类,可用于加载并展示不同格式的图片资源,并且支持对图像进行一些基本的操作,像缩放、旋转等。
该模块还包含了众多用于事件处理的功能,例如针对窗口系统传递过来的鼠标、键盘等各类事件,都有相应的处理机制和函数可供开发者重写,以此来实现各种交互逻辑,比如鼠标悬停时改变按钮颜色、按下键盘某个按键执行特定操作等交互效果都能轻松达成。
此外,Qt GUI 模块还涉及字体和文本相关的类,开发者可以方便地设置界面上文本的字体样式、字号大小、颜色等属性,并且能够确保文本在不同平台、不同分辨率的屏幕上都能正确显示,保证了界面的一致性和可读性。
3.2.3 Qt Multimedia 模块
Qt Multimedia 模块为多媒体相关的应用开发提供了全方位的类库支持。
在音频处理方面,它允许开发者方便地实现音频的播放功能,能够加载不同格式的音频文件(如 MP3、WAV 等常见格式),并且可以控制音频的播放、暂停、停止、音量调节等操作,无论是开发简单的音乐播放器还是在其他应用中嵌入音频播放功能,都能轻松应对。
对于视频功能,它支持视频文件的播放,提供了视频渲染、播放控制(如播放进度控制、暂停、快进、快退等)的相关功能,同时也可以结合其他模块实现视频播放界面的定制化开发,比如添加播放列表、字幕显示等功能。
在摄像头应用方面,能够调用设备的摄像头进行视频采集,获取实时的视频流数据,开发者可以基于这些数据进行二次开发,例如实现视频通话、监控系统等应用场景。
而且该模块还涉及广播功能相关的类库,方便实现诸如网络广播、本地广播等功能,拓宽了多媒体应用的范围,满足多样化的项目需求。
四、QT 5.14.1 新功能亮点
4.1 各模块新特性
4.1.1 Qt 3D 模块
在 QT 5.14.1 中,Qt 3D 模块有了显著的改进与更新。其彻底检查了线程体系结构,例如删除了方面线程,同时检修了前端 / 后端节点同步,这一系列的操作使得模块在处理 3D 场景时更加高效和稳定。此外,使 QTransform 能够访问世界矩阵,还引入了 Scene3DView,并且现在 Scene3D 与 QtQuick 实现了同步,还可以在没有 FBO(帧缓冲对象)的情况下渲染为参考底图,这为开发 3D 应用尤其是对实时性要求较高的近实时仿真系统等带来了极大便利,开发者能够利用这些新特性打造出更加逼真、流畅的 3D 场景和应用效果。
4.1.2 Qt 蓝牙模块
Qt 蓝牙模块在 QT 5.14.1 里也有新的亮点呈现。它引入了一个新的、可选的 Win32 后端,该后端支持 Windows 7 和 8,不过需要注意的是,此后端不是默认构建的,也不是预构建程序包的一部分。对于 QLowEnergyController,引入了 AuthorizationError,还添加了按每个制造商 ID 包含多个制造商数据条目的功能,这在处理低功耗蓝牙设备连接以及相关数据交互等方面拓展了更多的可能性,方便开发人员更好地适配不同的蓝牙设备以及实现更复杂的蓝牙通信功能,比如在开发蓝牙连接的智能硬件设备控制应用等场景中就能够发挥作用。
4.1.3 Qt 核心模块
Qt 核心模块作为整个 Qt 类库的核心基础,在 QT 5.14.1 中同样增添了不少实用的新功能。通过实现适当的后端,在 QCalendar 中增加了对除格里高利历之外的日历的支持,像添加了后端,以实现公历、贾拉利(波斯)、伊斯兰民用、米兰科维奇和朱利安历法等多种历法,为涉及不同历法需求的应用开发提供了有力支撑。同时,还添加了 QColorConstants,这是一个提供 constexpr QColor 实例的命名空间,其优势在于不会花费任何运行时开销,在进行颜色相关的操作和属性设置时,能够让代码更加高效简洁。
4.1.4 Qt GUI 模块
Qt GUI 模块聚焦于 GUI 界面开发,在 QT 5.14.1 版本里更新了 High-DPI 支持,比如引入了应用程序可以选择使用的非整数比例因子(例如,比例因子为 150%),开发人员可以使用 QGuiApplication :: highDpiScaleFactorRoundingPolicy 或 QT_SCALE_FACTOR_ROUNDING_POLICY 来设置舍入策略,还添加了 QT_ENABLE_HIGHDPI_SCALING 环境变量,从而可以基于显示 DPI 进行高 DPI 缩放,替换了之前的 QT_AUTO_SCREEN_SCALE_FACTOR(现已弃用),并且对应于 Qt :: AA_EnableHighDpiScaling 应用程序属性。另外,增加了对图像的色彩空间支持,能够从 JPEG、PNG、WebP 和 TIFF 图像读取和写入色彩空间,并对图像执行色彩空间转换,而且在 QTextDocument 和 QTextTable 样式方面也有改进,通过 QTextTableCellFormat 添加了每边缘边框样式,添加了边框折叠模式,还添加了对(部分)HTML 表样式导入和导出的支持以及对将 Markdown 格式读写到 QTextDocument 的支持,以替代 HTML,这一系列更新让 GUI 界面在不同设备、不同分辨率下的显示效果和文本处理等方面都更加出色。
4.1.5 Qt 多媒体模块
Qt 多媒体模块在 QT 5.14.1 中持续扩充功能。添加了 QVideoFrame :: Format_YUV422P,为视频帧的格式支持增加了新的选项,方便在视频处理相关业务中进行更精细的操作。同时,引入了对 GStreamer OpenGL 插件的支持,这在多媒体播放、处理以及渲染等环节结合相关插件能够实现更强大的功能,例如在开发视频播放软件时,可以利用此插件实现更优质的视频播放效果,无论是音频播放、视频播放控制,还是摄像头应用、广播功能等方面,该模块都能凭借这些新特性更好地满足多样化的多媒体应用开发需求。
4.1.6 Qt 网络模块
QT 5.14.1 的 Qt 网络模块有了新的拓展。引入了 HTTP / 2 配置 API,方便开发人员在进行网络通信时按照 HTTP / 2 协议来配置相关参数,提升网络通信效率和性能。并且引入了网络连接监视功能,能够实时掌握网络连接状态,便于及时发现和处理网络连接异常等问题,还添加了对 Kerberos 代理身份验证的支持,在涉及需要代理认证的网络环境下,可以更安全、便捷地进行网络操作,为开发网络应用程序尤其是对网络安全和连接状态有要求的应用提供了更好的保障。
4.1.7 Qt QML 模块
Qt QML 模块在这个版本中也有功能上的更新完善。添加了 qmlRegisterSingletonInstance()函数,这允许将 QObject 作为单例公开给 QML,而不必创建 qmlRegisterSingletonType()所需的工厂函数,在常见用法中,它用作 setContextProperty()的类型安全替代,使得 QML 与 C++ 的交互更加灵活和安全。此外,添加了 qmlRegisterAnonymousType()来替代 qmlRegisterType(),它允许指定 URI 和主要版本,从而提供更好的工具支持,还在其中添加了实验性 - U 选项 qmllint,设置后,对不合格标识符的访问将生成警告,有助于开发人员编写更规范、严谨的 QML 代码。
4.1.8 Qt 快速模块
Qt 快速模块在 QT 5.14.1 里作为可选功能,添加了独立于图形 API 的 Scenegraph 渲染器的预览。当前支持多个平台,比如 Windows 10(Direct3D)、带有 X11 /xcb 的 Linux(Vulkan)、macOS(带有 MoltenVK 的金属或 Vulkan)、Android 7.0 以上版本(Vulkan),这使得合格的 Qt Quick 应用程序可以在 Vulkan、Metal 或 Direct3D 11 等图形 API 上运行,而不再局限于 OpenGL,为开发高性能、跨平台的动态界面应用提供了更多的图形渲染选择,拓展了应用在不同平台上的呈现效果和性能优化空间。同时,在 Text 和 TextEdit 中添加了对 Markdown 格式(包括 CommonMark 和 GitHub 方言)的支持,以替代 HTML,这包括 GitHub 清单扩展名,允许在 TextEdit 中切换复选框,默认情况下,将 TextEdit 切换为使用 I 型光标,并在将光标悬停在复选框或链接上时使用指向手形光标,当然也可以覆盖默认光标,还添加了 WheelHandler,它是鼠标滚轮的事件处理程序,还可以选择用于来自触控板的模拟鼠标滚轮事件,这些更新让文本交互和展示更加便捷、丰富。
五、QT 5.14.1 类库的应用场景
5.1 图形用户界面(GUI)应用开发
QT 5.14.1 类库在图形用户界面(GUI)应用开发方面展现出了强大的能力,无论是桌面端还是移动端等不同平台,都能借助它开发出功能丰富、界面美观且交互友好的应用程序。
在桌面端应用开发上,例如使用 Qt Widgets 模块,开发者可以轻松利用其提供的各类控件,像按钮、文本框、列表框等基础控件,通过组合和自定义就能搭建出复杂的用户界面。以常见的办公软件界面开发为例,利用 QWidget 作为基础窗口,搭配 QHBoxLayout、QVBoxLayout 等布局管理器对不同功能的按钮、文本编辑区域等进行合理布局,再结合 QPushButton 等按钮类的点击信号与对应的业务逻辑处理槽函数进行关联,就能实现诸如文档保存、格式设置等功能。而且,通过重写 QWidget 的绘图相关事件函数,还能实现自定义界面的绘制效果,打造出独具特色的软件外观。
在移动端应用开发方面,Qt Quick 模块发挥着重要作用。它基于 JavaScript 和 CSS 相关的语法风格,能够高效地构建出动态和响应式的界面。比如开发一款移动音乐播放应用,利用 Qt Quick 可以方便地实现界面的滑动切换效果、歌曲列表的动态展示以及播放按钮的动画效果等,给用户带来流畅且美观的操作体验。同时,Qt 5.14.1 的跨平台特性使得开发者在开发移动端应用时,使用与桌面端类似的代码逻辑和开发思路,只需要针对移动端的屏幕尺寸、操作习惯等进行适当的适配调整,就能轻松将应用部署到 Android 和 iOS 等不同的移动端操作系统上,大大节省了开发成本,提高了开发效率。
总之,QT 5.14.1 类库在图形用户界面应用开发中,从界面设计的便捷性到交互逻辑的实现,都为开发者提供了全方位的支持,助力开发出高质量的 GUI 应用。
5.2 网络应用程序开发
QT 5.14.1 类库在网络编程方面提供了丰富且实用的网络相关类和函数,有力地推动了高效网络应用程序的开发。
其中,新引入的 HTTP/2 配置 API 极大地便利了网络通信中遵循 HTTP/2 协议的参数配置工作。例如在开发一个大型网站的客户端应用时,通过该 API 可以按照 HTTP/2 协议来优化网络请求和响应的设置,使得数据传输更加高效,提升网页内容的加载速度,改善用户体验。
网络连接监视功能也是一大亮点,它能够实时掌握网络连接的状态。比如在开发一个在线视频播放应用时,如果网络出现波动或者连接异常,借助这个功能,应用可以及时检测到并向用户反馈相应的提示信息,或者自动进行一些如切换清晰度、暂停播放等应对操作,避免出现视频卡顿或无法播放等糟糕情况。
此外,对 Kerberos 代理身份验证的支持增强了网络应用在特定网络环境下的安全性。像企业内部的网络应用,往往需要经过代理服务器进行身份验证才能访问外部资源,此时利用该功能,就能安全、便捷地完成网络操作,保障数据传输的保密性和完整性。
再比如,在进行 Socket 通信编程时,QTcpSocket、QTcpServer 等类为基于 TCP 协议的网络通信提供了便捷的客户端和服务器端功能支持。开发者可以轻松地创建客户端套接字,通过 connectToHost () 方法与服务器建立连接,再利用 write () 方法发送数据、readAll () 方法接收数据;而服务器端则可以通过 QTcpServer 类监听指定端口,等待客户端连接请求,一旦有新连接,就能创建对应的 QTcpSocket 实例进行后续通信操作,实现诸如文件传输、在线聊天等多种网络应用场景。
总之,QT 5.14.1 类库中的网络相关功能为开发各类网络应用程序提供了坚实的基础和有力的保障,使其能够更好地应对不同网络环境下的开发需求。
5.3 嵌入式应用程序开发
QT 5.14.1 在嵌入式系统开发中有着诸多应用优势,深受嵌入式工程师的青睐。
首先,它具备出色的跨平台性,支持多种操作系统,像嵌入式 Linux 平台以及一些带有 FramBuffer 的嵌入式设备操作系统等。这意味着开发者可以基于 QT 5.14.1 开发出一套代码,然后根据实际的硬件环境进行适配,就能在不同的嵌入式系统上运行应用程序,无需为每个特定的嵌入式平台重新编写大量代码,大大降低了开发的复杂性和工作量。
在硬件支持方面,QT 5.14.1 能够适配不同处理器架构的嵌入式设备,无论是常见的 ARM 架构,还是其他类型的处理器,都可以较好地与之配合开展开发工作。例如在开发一款车载嵌入式导航系统时,不管是采用何种处理器的硬件平台,只要该平台满足 QT 5.14.1 的运行要求,就能利用其丰富的类库来实现地图显示、路线规划、语音提示等功能。
其相关模块之间配合紧密,协同助力嵌入式应用开发。例如 Qt Core 模块提供了如信号与槽机制、对象树管理等核心功能,方便在嵌入式应用中进行对象间通信以及内存管理;Qt GUI 模块则为图形界面开发提供了诸如绘制图形、处理图像显示、响应各类输入事件等功能,便于打造出直观易用的嵌入式设备操作界面;而 Qt Multimedia 模块在有音频、视频等多媒体需求的嵌入式应用场景中发挥作用,像在一些嵌入式监控设备中,可以借助该模块实现视频采集、存储以及远程查看等功能。
同时,开发方式多样,嵌入式工程师可以根据项目的具体情况选择合适的方式。比如使用 Qt Designer 进行 UI 设计,通过拖放和调整控件就能快速设计和布局用户界面,适用于需要快速原型设计或界面修改的场景;或者采用纯 Qt Creator 编码方式,深入编写程序逻辑,适用于项目规模较小且不需要频繁修改 UI 界面的情况;还可以运用 QML+Java+C++ 混合编程,实现更复杂的交互和动态效果,满足如开发嵌入式游戏、多媒体应用等需求。