第三章 3.2 全局定义、容器类

Qt全局定义、容器类、容器类的迭代器、Qt类库的模块

本篇简要介绍Qt全局定义中的数据类型、函数、宏定义;容器类中:顺序容器类、关联容器类;容器类的迭代器;Qt类库的模块。

一、Qt全局定义

<QtGlobal>头文件包含了Qt类库的一些全局,包括基本数据类型,函数和宏。一般的Qt类库头文件都会包含该文件,因此不用显式包含此头文件。

1、数据类型定义

详见《Qt5.9 c++开发指南》

2、函数

<QtGlobal>头文件包含一些常用函数的定义,这些函数多以模板类型作为参数,返回相应的模板类型,模板类型可以用任何其他类型替换。若是以double或float类型数作为参数的,一般有两个参数版本的同名函数,如qFuzzyIsNull(double d)和qFuzzyIsNull(float f)。常用的全局函数见《Qt5.9 c++开发指南》。

3、宏定义

<QtGlobal>头文件中定义了很多宏,以下一些是比较常用的:(仅做简单介绍,详见《Qt5.9 c++开发指南》)

(1)QT_VERSION

这个宏展开为数值形式0xMMNNPP(MM= major,NN = minor, PP = patch)表示Qt 编译器版本,例如Qt编译器版本为Qt5.9.1,则QT_VERSION 为0x050901。这个宏常用于条件编译设置根据 Qt 版本不同,编译不同的代码段。

(2)QT_VERSION_CHECK

这个宏展开为 Qt版本号的一个整数表示。

(3)QT_VERSION_STR

这个宏展开为 Qt版本号的字符串。

(4)Q_BYTE_ORDER、Q_BIG_ENDIAN 和 Q_LITTLE_ENDIAN

Q_BYTE_ORDER 表示系统内存中数据的字节序,Q_BIG_ENDIAN 表示大端字节序,Q_LITTLE_ENDIAN 表示小端字节序。在需要判断系统字节序时会用到。

(5)Q_DECL_IMPORT 和Q_DECL_EXPORT

在使用或设计共享库时,用于导入或导出库的内容,后期会进行介绍。

(6)Q_DECL_OVERRIDE

在类定义中,用于重载一个虚函数,例如子啊某个类中重载虚函数paintEvent(),可以定义如下:

void paintEvent(QPaintEvent*) Q_DECL_OVERRIDE;

使用Q_DECL_OVERRIDE宏后,如果重载的虚函数没有进行任何重载操作,编译器将会报错。

(7)Q_DECL_FINAL

这个宏将一个虚函数定义为最终级别,不能再被重载,或定义一个类不能再被继承。

(8)Q_UNUSED(name)

这个宏用于在函数中定义不在函数体里使用的参数。

(9)foreach(variable,container)

用于容器类的遍历

(10)forever

用于构造一个无限循环

(11)qDebug(const char* message, …)

在debugger窗体显示信息,如果编译器设置了Qt_NO_DEBUG_OUTPUT,则不做任何输出;类似的宏还有:qWarning、qCritical、qFatal、qInfo等,也是用于debugger窗体显示信息

二、容器类

1、容器类概述

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

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

    以下为 QList定义一个字符串列表容器及使用的例子:

QList<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 宏用于遍历容器内的所有数据项。

2、顺序容器类

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

参考链接QList、QLinkedList、QVector类中对这几个容器类进行了介绍,并从时间复杂度上进行了对比,QList是首选。

(1)QList

是最常用的容器类,虽然它是以数组列表 (array-list)的形式实现的,并基于索引访问(index-based),但是在其前或后添加数据非常快,QList 以下标索引的方式对数据项进行访问。

QList 用于添加、插入、替换、移动、删除数据项的函数有: insert()、replace()、removeAt()、move()、swap()、append()、prepend()、removeFirst()和 removeLast()等。

QList 提供下标索引方式访问数据项,如同数组一样,也提供 at()函数

(2)QlinkedList

QLinkedList是链式列表 (linked-list),数据项不是用连续的内存存储的,它基于选代器访问数据项,并且插入和删除数据项的操作时间相同。

除了不提供基于下标索引的数据项访问外,QLinkedList 的其他接口函数与 QList 基本相同

(3)QVector

QVector提供动态数组的功能,以下标索引访问数据。

QVector 的函数接口与 QList 乎完全相同,QVector的性能比 QList更高,因为QVector的数据项是连续存储的。

(4)QStack

QStack是提供类似于堆栈的后入先出 (LIFO)操作的容器类,push()和 pop()是主要的接口函数。

QStack<int> stack;

stack.push(10);

stack.push(20);

stack.push(30);

while (!stack.isEmpty())

cout << stack.pop() << endl;

程序依次输出30,20,10

(5)QQueue

QQueue是提供类似于队列先入先出 (FIFO)操作的容器类。enqueue()和 dequeue()是主要操作函数。例如:

QQueue<int> queue;

queue.enqueue(10);

queue.enqueue (20);

queue.enqueue(30);

while (!queue.isEmpty())

cout << queue.dequeue() << endl;

程序依次输出10,20,30

3、关联容器类

Qt 还提供关联容器类QMap、QMultiMap、QHash、QMultiHash 和 QSet。QMultiMap和QMultiHash 支持一个键关联多个值,QHash和 QMultiHash 类使用散列(Hash)函数进行查找,查找速度更快。

(1) QSet

QSet 是基于散列表的集合模板类,它存储数据的顺序是不定的,查找值的速度非常快。QSet内部就是用QHash 实现的

(2) QMap

QMap<Key,T>提供一个字典(关联数组),一个键映射到一个值。QMap 存储数据是按照键的顺序,如果不在乎存储顺序,使用 QHash 会更快。

(3)QMultiMap

QMultiMap 是QMap 的子类,是用于处理多值映射的便利类。

多值映射就是一个键可以对应多个值。QMap 正常情况下不允许多值映射,除非使用QMap::insertMulti0添加键值对。

(4)QHash

QHash 是基于散列表来实现字典功能的模板类,QHash<Key,T>存储的键值对具有非常快的查找速度。QHash 与QMap 的功能和用法相似,区别在于以下几点:

QHash 比 QMap 的查找速度快;在QMap 上遍历时,数据项是按照键排序的,而QHash 的数据项是任意顺序的;

    QMap 的键必须提供“<”运算符,QHash 的键必须提供“==”运算符和一个名称为qHash()的全局散列函数。

(5)QMultiHash

QMultiHash 是 QHash 的子类,是用于处理多值映射的便利类,其用法与 QMultiMap 类似。

4、容器类的迭代

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

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

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

(1) Java 类型的迭代器

对于每个容器类,有两个Java 类型迭代器:一个用于只读操作,一个用于读写操作,各个Java类型的容器类迭代器如下所示,具体使用详见《Qt5.9 c++开发指南》

(2)STL 类型的迭代器

对于每一个容器类,都有两个 STL 类型选代器:一个用于只读访问,一个用于读写访问。无需修改数据时一定使用只读迭代器,因为它们速度更快。

STL迭代器与 Qt和STL的原生算法兼容,并且进行了速度优化。具体类型见下表,具体使用详见《Qt5.9 c++开发指南》。

(3)foreach关键字

如果只是想遍历容器中所有的项,可以使用 foreach 关键字。foreach 是头文件中定义的一个宏。使用 foreach 的句法是:

foreach (variable, container)

使用 foreach 的代码比使用迭代器更简洁。例如,使用foreach 遍历一个 QLinkedList的示例代码如下:

QLinkedList<QString> list;

...

QString str;

foreach (str,list)

gDebug() << str;

其他使用见《Qt5.9 c++开发指南》

5、Qt类库的模块

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

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

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

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

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

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

Qt 基本模块是 Qt 在所有平台上的基本功能,它们在所有的开发平台和目标平台上都可用在Ot5 所有版本上是源代码和二进制兼容的。

其他的模块一般不会被自动加入到项目,如果需要在项目中使用某个模块,则可以在项目配置中添加此模块。例如,如果需要在项目中使用Qt Multimedia和Qt Multimedia Widgets 模块,需要在项目配置文件中加入如下的语句:

QT += multimedia multimediawidgets

需要在项目中使用 Qt SQL 模块,就在项目配置文件中加入如下的语句:

QT += sql

具体详见《Qt5.9 c++开发指南》。

参考:

https://blog.csdn.net/Dasis/article/details/131621043

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值