QT类库
QT核心特色
- QT是一个跨平台开发的类库。
- QT的元对象编译器MOC是一个预处理器,在源程序被编译前先将这些QT特性的程序转为标准的C++兼容的形式,而后再有标准的C++编译器进行编译。也就是为何在使用信号和槽的机制的类里,必须添加一个Q_OBJECT宏的缘由,只有添加了这个宏,moc才能对类里的信号与槽代码进行预处理。
- QT Core模块是qt类库的核心。
QT元对象系统
- 元对象系统由三个基础组成:(1)QObject类是全部使用元对象系统类的基类。(2)在一个类的private部分申明Q_OBJECT宏,使得类可使用元对象的特性,如动态属性,信号与槽。(3)MOC为每一个QObject的子类提供必要的代码来实现元对象系统的特性;构建项目时MOC工具读取C++源文件,当它发现类的定义里有Q_OBJECT宏时,它会为这个类生成另一个包含有元对象支持代码的C++源文件,这个生成的源文件连同类的实现文件一块儿被编译和链接。
元对象的其它功能
- QObject::metaObject()函数返回关联的元对象,元对象类QMetaObject包含了访问元对象的一些接口函数。
- QMetaObject::newInstance()函数建立类的一个新的实例。
- QObject::inherits(const char* className)函数判断一个对象实例是不是名称为className的类或QObject的子类的实例。
- QObject::tr()和QObject::reUtf8()函数可翻译字符串,用于多语言界面设计。
- QObject::setProperty()和QObject::property()用于经过属性名动态设置和获取属性值。
属性系统
- QT提供了一个Q_PROPERTY()宏能够定义属性,他也是基于元对象系统实现的。
- 动态属性,定义了属性后,能够经过QObject::setProperty()函数设置属性值;能够经过QObject::property()函数来获取属性值。
- 类的附加信息:属性系统还有一个宏Q_CLASSINFO(),能够为类的元对象定义“名称--值信息”。
信号与槽
- connect()函数有多种重载
- 不论是那种参数形式的connect()函数,最后都会有一个参数Qt::ConnectionType type,默认值为Qt::AutoConnection.枚举类型Qt::ConnectionType表示信号与槽之间的关联方式,有Qt::AutoConnection(缺省值):若是信号的接受者和发送这在同一个线程,就使用Qt::DirectConnection方式;不然使用QT::QUeuedConnection方式,在信号发射时自动肯定关联方式;Qt::DirectionConnection:信号被发射时槽函数当即执行,槽函数和信号在同一个线程;Qt::QueuedConnection:在时间循环回到接收者线程后执行槽函数,槽函数与信号在不一样的线程;Qt::BlockingQueuedConnection:与Qt::QueuedConnection类似,只是信号线程会阻塞直到槽函数执行完毕,当信号和槽在同一个线程时绝对不能使用这种方式,不然会形成死锁。
- 使用Sender()得到信号发射者。例如在QSpinx的ValueChanged(int)信号的槽函数里,能够经过Sender()和qobject_cast得到信号发射者的指针,从而对信号发射者进行操做。QSpinBox *spinBox=qobject_caet<QSpinBox *>(sender());
- 自定义信号以及其使用:在本身设计的类里也能够自定义信号,信号就是在类定义里声明的一个函数,无需实现,只须要发射(emit)。信号函数必须是无返回值的函数,可是能够有输入参数。
Qt全局定义
头文件包含了Qt类库的一些全局定义,包括基本的数据类型,函数,和宏,通常Qt类的头文件都会包含该头文件。
java
数据类型定义
- 为了确保在各个平台上个数据类型都有统一肯定的长度,Qt为各类常见的数据类型定义了类型符号。
- 数据类型定义以下图所示:

函数
宏定义
经常使用的宏
- QT_VERSSION 这个宏展开为数值形式0xMMNNPP表示QT编译器版本,例如Qt编译器版本为Qt5.9.1,则QT_VERSION为0x050901。这个宏经常使用语条件编译设置,根据qt版本不一样,编译不一样的代码段。
- QT_VERSION_CHECK 这个宏展开为Qt版本号的一个整数表示。
- QT_VERSION_STR 这个宏展开为Qt版本号的字符串,如“5.9.0”
- 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_OIVERRIDE 在类定义中,用于重载一个虚函数,使用此宏后,若是重载的虚函数没有进行任何重载操做,编译器将会报错。
- Q_DECL_FINAL 这个宏将一个虚函数定义为最终级别,不能再被重载,或定义一个类不能再被继承。
- Q_UNUSED(name) 这个宏用于在函数中定义不在函数体力使用的参数。
- foreach(variable,container) 用于容器类的遍历。
- forever 用于构造一个无限循环。
- qDebug(const char * message,...) 在debugger窗体显示信息,若是编译器设置了Qt_NO_DEBUG_OUTPUT,则不做任何输出。相似的宏还有qWarning,qCritical,qFatal,qInfo,也是用于在debugger窗体显示信息。
容器类
Qt容器类比标准模板库(STL)中的容器类更轻巧,安全和易于使用。这些容器类是掩式共享和可重入的,并且他们进行了速度和存储优化,他们是线程安全的,也就是说他们做为制度容器可被多个线程访问。函数
顺序容器类
- Qt的顺序容器类有QList,QLinkedList,QVector,QStack和QQueue。
- QList是最经常使用的容器类,基于数组列表的形式实现的。
- QLinkedList是链式列表,数据项不是用连续的内存存储的,它基于迭代器访问数据项。
- QVector提供动态数组的功能,如下标索引访问数据;QVector的性能比QList更高,由于QVector的数据项是连续存储的。
- QStack是提供相似于堆栈的后入先出操做的容器类,push()和pop()是主要的接口函数。
- QQueue是提供与相似于队列先入先出操做的容器类,enqueue()和dequeue()是主要的操做函数。
关联容器类
- 关联容器类包括QMap,QMultiMap,QHash,QMultiHash,QSet。
- QMultiMap和QMultiHash支持一个键关联多个值,QHash和QMultiHash类使用散列函数进行查找,查找的速度更快。
- QSet是基于散列表的集合模板类,他存储数据的顺序是不定的,查找值的速度很是快。QSet内部就是用QHash实现的。
- QMap<Key,T>提供一个字典,一个键映射一个值,QMap存储数据是按照键的顺序,若是不在意存储顺序,使用QHash会更快。
- QMultiMap是map的子类,是用于处理多只映射的便利类。QMa正常状况下是不容许多值映射,除非使用QMap::insertMulti()添加键值对。
- QHash是基于散列表来实现字典功能的模板类,QHash<Key,T>存储的键值对具备很是快的查找速度。QHash和QMap,前者比后者的查找速度快;在后者上遍历时,数据项是按照键排序的,而前者的数据项是任意顺序的;QMap的键必须提供“<”运算符,QHash的键必须提供“==”运算符和一个名称为qHash()的全局散列函数。
- QMultiHash是QHash的子类,是用于处理多只映射的便利类。
容器类的迭代
迭代器(iterator)为访问容器类里的数据项提供了统一的方法;Qt有两种迭代器类:Java类型迭代器和STL类型的迭代器。工具
- Java类型的迭代器更易于使用,且提供了一些高级的功能,而STL类型的迭代器效率更高。
- Qt还提供了一个关键字foreach(
里定义的一个宏)用于方便地访问容器里全部数据项。
Java类型迭代器
对于每一个容器类,有两个java类型迭代器:一个用于只读操做,一个用于读写操做,每一个迭代器和容器类的迭代关系以下图所示:

Java类型的迭代器的指针不是指向下一个数据项,而是在数据项之间。性能
STL类型迭代器
STL迭代器与Qt和STL的原生算法兼容,而且进行了速度优化,对于每个容器类,都有两个STL类型迭代器,一个用于制度访问,一个用于读写访问,无需修改数据时必定使用制度迭代器,由于速度更快;STL类型迭代器是是数组的指针,因此++运算符使迭代器指向下一个数据项,“*”运算符返回数据项内容。与Java类型迭代器不一样,STL迭代器直接指向数据项。STL迭代器类型以下所示:
测试
foreach能够遍历集合中全部的项
Qt类库模块
Qt类库里大量的类根据功能分为各类模块,这些模块又分为几大类。优化
- Qt基本模块:提供Qt在全部平台上的基本功能。
- Qt附加木块:实现一些特定功能的提供附加价值的模块。
- 增值模块:单独发布的提供额外价值的模块或工具。
- 技术预览模块:一些处于开发阶段,可是能够做为技术预览使用的模块。
- Qt工具:帮助应用程序开发的一些工具。
QT基本模块
Qt基本模块是Qt在全部平台上的基本功能,他们在全部的平台和目标平台上均可以用。具体的模块以下图所示:
ui
- Qt Core模块是Qt类库的核心,其它全部的模块都依赖于此模块,若是是用qmake构建项目,则Qt Core模块是自动被加入到项目的。
- Qt GUI模块提供了用于开发GUI应用程序必要的类,使用qmake构建应用程序时,Qt GUI模块是自动被加入项目的,若是不使用GUI功能,则须要在项目配置文件中加入以下一行:QT -=gui
- 其它模块通常不会被自动加入到项目中,若是须要在项目中用某个模块,则能够在项目配置中个添加此模块,例如Qt Network则须要在配置文件中加入:“QT += network”
Qt附加模块
Qt附加模块能够实现一些特定目的,这些模块可能只能在某些平台上有,或只能用于某些操做系统,或只是为了向后兼容。用户安装时能够选择性的安装这些附加模块。Qt附加模块列表(未烈出一些过期的模块,以及专门用于QML或QtQuick的模块)以下图所示:

Qt增值模块
除了随Qt5发布的上述这些模块,还有一些模块是单独发布的,这些模块只在商业版许可的Qt里才有。

技术预览模块
还处于开发和测试阶段的模块。
Qt工具
Qt工具在全部支持的平台上均可以使用,用于帮助应用程序的开发和设计,Qt工具以下图所示:
