《Qt 5.9 C++开发指南》第3章 Qt类库概述【详细摘要】

Qt是一个用标准C++编写的跨平台开发类库,它对标准C++进行了扩展,引入了元对象系统、信号与槽、属性等特性,使得应用程序开发变得更高效。本章介绍Qt的这些核心特点,对于理解和编写高效的Qt C++程序是大有帮助的。

本章还介绍<QtGlobal>头文件中Qt的一些全局定义,包括数据类型、函数和宏等,介绍Qt的容器类及其相应迭代器的使用方法。这些全局定义和容器类在程序中经常用到,了解其原理便于理解后面遇到的一些实例程序。

3.1  Qt核心特点

Qt对标准C++进行了扩展,引入了一些新的概念和功能,例如信号与槽、对象属性等。Qt的元对象编译器moc(Meta-Object Compiler)是一个预处理器,在源程序被编译前先将这些Qt特性的程序转换为标准C++兼容的形式,然后再由标准C++编译器进行编译。这就是为什么在使用信号与槽机制的类里,必须添加一个Q_OBJECT宏的原因,只有添加了这个宏,moc才能对类里的信号与槽的代码进行预处理。

Qt的元对象系统(meta-object system)提供了对象之间通讯的信号与槽机制、运行时类型信息和动态属性系统。

本节详细介绍了Qt的元对象系统、属性系统、信号与槽的机制和用法,并用一个实例程序samp3_1演示了元对象系统一些特性的使用方法,如动态获取类型信息、通过属性设置或访问类的数据、自定义信号等。

实例samp3_1运行时界面(书中第56 页)

本节内容对于深入理解Qt的特点,灵活使用Qt的元对象系统大有帮助。内容可能有些难懂,可以在对Qt较熟悉后再回来看这部分内容,可获得更深入的理解。

3.2 Qt全局定义

<QtGlobal>头文件包含了Qt类库的一些全局定义,包括基本数据类型、函数和宏。

为了确保在各个平台上各数据类型都有统一确定的长度,Qt为各种常见数据类型定义了类型符号,例如qint8就是signed char的类型定义,即:

typedef  signed char   qint8;

还有quint8、qint16、qint32、qreal等定义。

<QtGlobal>中定义了一些常用函数,如qMin,qrand等。还有一些基础的数学运算函数在<QtMath>头文件中定义,比如三角运算函数、弧度与角度之间的转换函数等。

<QtGlobal>头文件中定义了很多宏,例如程序中经常用到的一个宏Q_UNUSED(name),用于在函数中定义不在函数体里使用的参数,如:


void MainWindow::on_imageSaved(int id, const QString &fileName)
{
    Q_UNUSED(id);
    LabInfo->setText("图片保存为: "+fileName);
}

在这个函数里,id参数没有使用。如果不用Q_UNUSED(id)定义,编译器会出现参数id未被使用的警告。

3.3 容器类

Qt提供了多个基于模板的容器类,这些容器类可以用于存储指定类型的数据项,例如常用的字符串列表类QStringList就是从容器类 QList<QString>继承的,实现对字符串列表的添加、存储、删除等操作。

Qt的容器类比STL(标准模板库)中的容器类更轻巧、安全和易于使用。这些容器类是隐式共享和可重入的,而且它们进行了速度和存储优化,因而可以减少可执行文件的大小。此外,它们还是线程安全的,也就是它们作为只读容器时可被多个线程访问。

容器类是基于模板的类,例如常用的容器类QList<T>,T是一个具体的类型,可以是int, float等简单类型,也可以是QString, QDate等类,但是不能是QObject或任何其子类。T必须是一个可赋值的类型,即T必须提供一个缺省的构造函数,一个可复制构造函数和一个赋值运算符。

例如用QList<T>定义一个字符串列表的容器,其定义方法是:

QList<QString>  aList;

这样定义了一个QList容器类的变量aList,它的数据项是QString,所以aList可以用于处理字符串列表,例如:

aList.append(“Monday”);
aList.append(“Tuesday”);
aList.append(“Wednesday”);
QString  str=aList[0];

Qt的容器类分为顺序容器(sequential containers)和关联容器(associative containers)。

容器迭代类用于遍历容器里的数据项,有Java类型的迭代类和STL类型的迭代类。Java类型的迭代类易于使用,提供高级功能,而STL类型的迭代类效率更高一些。

Qt还提供了foreach宏用于遍历容器内的所有数据项。

Qt的顺序容器类有QList,QLinkedList,QVector,QStack和QQueue。

Qt的关联容器类有QMap,QMultiMap,QHash,QMultiHash和QSet。

QMultiMap和QMultiHash支持一个键关联多个值,QHash和QMultiHash类使用哈希(Hash)函数进行查找,查找速度更快。

本节介绍了各种容器类的特点和用法。

3.4 容器类的迭代

迭代器(iterator)为访问容器类里的数据项提供了统一的方法,Qt有两种迭代器类:Java类型的迭代器和STL类型的迭代器。

Java类型的迭代器更易于使用,且提供一些高级功能,而STL类型的迭代器效率更高。

Qt还提供一个关键字foreach(实际是< QtGlobal >里定义的一个宏)用于方便地访问容器里所有数据项。

本节介绍了各种迭代器的特点和使用方法。

3.5 Qt类库的模块

Qt类库里大量的类根据功能分为各种模块,这些模块又分为几大类:

●       Qt Essentials(Qt基本模块),提供了Qt在所有平台上的基本功能。

●       Qt Add-Ons(Qt附加模块),实现一些特定功能的提供附加价值的模块。

●       Value-Add Modules(增值模块),单独发布的提供额外价值的模块或工具。

●       Technology Preview Modules(技术预览模块),一些处于开发阶段,但是可以作为技术预览使用的模块。

●       Qt Tools(Qt工具),帮助应用程序开发的一些工具。

Qt官网的“All Modules”页面(https://doc.qt.io/qt-5/qtmodules.html)可以查看所有这些模块的信息。

本节简要介绍了这些大类模块中包含的子模块,学习Qt主要就是学习这些模块的中的类的使用。如同学习英语,掌握了语法的各种类型和大的词汇量,才可以灵活应用英语。学会了Qt中各个模块的类的用法,就能灵活实现各种功能需求。



<总目录>        <上一章>            <下一章>



猜你喜欢

转载自blog.csdn.net/HongAndYi/article/details/80458267