4. Qt 模块

在前面的章节中,我们创建一个工程后,在.pro文件中都会有一句: QT += core gui, 该语句添加了项目中使用的Qt模块。

Qt中存在模块化的概念,将众多功能细分到几个模块之中,大量的类根据功能分为各种模块,我们需要哪些功能就添加相关模块。

Qt5中模块分为基础模块(Essential Modules)、附加模块(Add-On Modules)、增值模块(Value-Add Modules)、还有一些Qt工具(Qt Tools), 在Qt6一些新版本中还有技术预览模块(Technical Preview)。

  • 基础模块提供了Qt在所有平台上的基本功能;

  • 附加模块是实现一些特定功能的提供附加价值的模块,这些模块可能仅在某些开发平台上可用;

  • 增值模块是提供额外功能的模块或工具,在一些商业许可下提供;

  • Qt工具在所有受支持的开发平台上运行,有助于应用程序的开发和设计;

  • 预览模块是一些处于开发阶段,但是可以作为技术预览使用的模块。

本章将简单介绍Qt框架下部分模块以及其他相关知识,详细的模块信息点击 这里

4.1. Qt 基础模块

基本模块是各平台通用的,一些模块的说明看下下面表格:

模块

说明

Qt Core

Qt框架的核心,是其他模块的基石,定义了其他模块使用的核心非图形类

Qt Gui

图形用户界面 (GUI) 组件的基类,包括OpenGL

Qt Multimedia

音视频,相机和广播等功能

Qt Multimedia Widgets

基于widgets类的多媒体功能

Qt Network

网络相关的类

Qt QML

一些QML和Javascript语言的类

Qt Quick

用于构建具有自定义用户界面的高度动态应用程序的声明性框架

Qt Quick Controls

创建桌面样式用户界面,基于 Qt Quick 的用户界面控件

Qt Quick Dialogs

用于 Qt Quick 的系统对话框类型

Qt Quick Layouts

用于 Qt Quick 2 界面元素的布局项

Qt Quick Test

QML应用程序的单元测试框架

Qt SQL

使用SQL用于数据库操作的类

Qt Test

用于应用程序和库进行单元测试的类

Qt Widgets

用于构建GUI界面​C++图形组件类

使用Qt Creator创建的qmake项目,默认会在pro文件中添加core和gui模块。 要额外添加或者删除一些模块,只想要在.pro文件中修改即可,例如:

# 添加Qt Multimedia 和 Qt Multimedia Widgets模块
QT += multimedia multimediawidgets

# 不需要Qt Gui模块
QT -= gui

4.2. 附加模块

Qt的附加模块可以实现一些特定目的。 这些模块可能只在某些开发平台上有,或只能用于某些操作系统,或只是为了向后兼容,或者需要商业许可证,用户安装时可以选择性地安装这些附加模块。

下面列举一些常见的附加模块:

模块

描述

Active Qt

用于开发使用ActiveX和COM的Windows应用程序

Qt 3D

支持2D和3D渲染,提供用于开发近实时的仿真系统,支持所有平台

Qt WebEngine

提供类和函数,实现在应用程序中嵌入网页内容

Qt Charts

用于数据显示的二维图表组件

Qt Virtual Keyboard

实现不同输入法的虚拟键盘框架

提示

后面章节将介绍部分功能模块和各种界面组件。

4.3. Qt 宏定义

<QtGlobal>头文件中定义了很多宏,下面列出常见的Qt宏定义:

描述

QT_VERSION

表示Qt版本,宏展开为数值形式 0xMMNNPP (MM = major, NN = minor, PP = patch)

Q_UNUSED(name)

用于在函数中定义不在函数体里使用的参数

Q_BYTE_ORDER

表示系统内存中数据使用的字节序

foreach(variable, container)

用于遍历容器的内容

qDebug(const char *message, …)

用于在调试窗口显示信息,可以格式化输出各种数据

Q_FUNC_INFO

函数信息宏,包含所在函数的属类和参数信息,一般配合qDebug使用,输出调试信息

Q_DECL_EXPORT/Q_DECL_EXPORT

共享库的导出和导入

上面宏的具体使用参考下:https://doc.qt.io/qt-5/qtglobal.html#QT_VERSION

4.4. Qt NameSpace(命名空间)

命名空间是C++引入的可以由用户命名的作用域,用来处理程序中常见的同名冲突; C++中,命名空间使用namespace来声明,并使用{}来界定命名空间的作用域。

Qt中的使用namespace以及{}来界定命名空间的作用域, 例如我们使用Qt Creator创建一个带窗体的工程:

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
};

QT_BEGIN_NAMESPACE和QT_END_NAMESPACE是Qt的宏定义,用于启动命令空间的补充(Qt自己定义的命名空间), 它们之间的namespace Ui { class MainWindow; }定义了一个名为Ui的命名空间,并在其中声明了一个名为MainWindow的类。

这个命名空间是Qt的UI组件命名空间,用于表示Qt应用程序的用户界面组件。 MainWindow是Qt应用程序的主窗口类,它通常包含应用程序的主要功能和用户界面元素。

后面部分是定义MainWindow类(和UI中的MainWindow是不同的类,由于命名空间的不同),包含一个私有成员变量ui,该变量是一个指向Ui命名空间的MainWindow对象的指针。

这样通过namespace命名空间很好的解决了同名的函数的问题,而且把界面都给它隔开了,实现了Qt中界面与逻辑业务的分离。