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类的头文件都会包含该头文件。

数据类型定义

  • 为了确保在各个平台上个数据类型都有统一确定的长度,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在所有平台上的基本功能,他们在所有的平台和目标平台上都可以用。具体的模块如下图所示:

  • 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工具如下图所示:

Qt类库介绍的更多相关文章

  1. C++类库介绍

    如果你有一定的C基础可能学起来比较容易些,但是学习C++的过程中又要尽量避免去使用一些C中的思想:平时还要多看一些高手写的代码,遇到问题多多思考,怎样才能把问题抽象化,以使自己头脑中有类的概念:最后别 ...

  2. Qt版权介绍:GPL, LGPL 以及 Commercial 授权

    http://blog.csdn.net/changsheng230/article/details/6167933 Qt版权介绍:GPL, LGPL 以及 Commercial 授权 分类: Qt ...

  3. JAVA基本类库介绍

    我们曾经讲过,Java已经为编程者编制了许多类,这些类已经经过测试,基本上不存在错误,这些类都是我们编程的基础.如果不利用这些已存在的类,我们的 编程工作将变得异常复杂,所以我们应尽可能多的掌握Jav ...

  4. QT类库与Delphi类库的体系结构对比——两者十分类似!

    今天在看QT对象内存管理的一篇文章时:http://blog.csdn.net/dbzhang800/article/details/6300025想到了一个问题:就是QT类库体系结构与Delphi类 ...

  5. QT-第一个程序 Hello QT , 以及QT creator介绍

    第一个程序 - Hello QT 首先写main.cpp: #include <QApplication> #include <QMainWindow> #include &l ...

  6. ArcGIS Engine中的重点类库介绍

    转自原文ArcGIS Engine中的重点类库介绍 System类库 System类库是ArcGIS体系结构中最底层的类库.System类库包含给构成ArcGIS的其他类库提供服务的组件.System ...

  7. QT类库与Delphi VCL类库的体系结构对比——两者十分类似!

    今天在看QT对象内存管理的一篇文章时:http://blog.csdn.net/dbzhang800/article/details/6300025想到了一个问题:就是QT类库体系结构与Delphi类 ...

  8. PyQt类库介绍

    安装完PyQt后我们去看看这个库里面有些什么cd /usr/lib/python3/dist-packages/PyQt5/  && ls都是些.so的动态链接库,这就是为什么我们在安 ...

  9. Qt Linguist介绍

    简介 Qt提供了一款优秀的支持Qt C++和Qt Quick应用程序的翻译工具.发布者.翻译者和开发者可以使用这款工具来完成他们的任务. 发布者:承担了全面发布应用程序的责任.通常,他们协调开发者和翻 ...

随机推荐

  1. Python中判断字符串是否为数字、字母、标识符、浮点数、大小写、可打印的方法

    1.判断s是否都是大写字母:s.isupper(): 2.判断s是否都是小写字母:s.islower(): 3.判断s中的每个单词首字母是否都是大写字母且其他位置无大写字母:s.istitle(),要 ...

  2. Python函数独立星号(*)分隔的命名关键字参数

    如果需要限制关键字参数的输入名字,就需要使用到命名关键字参数的形式,所谓命名关键字参数就是给关键字参数限定指定的名字,输入其他名字不能识别.命名关键字参数和位置参数之间使用独立的星号(*)分隔,星号后 ...

  3. 手机APP测试(测试点、测试流程、功能测试)

    1.功能测试 1.1 启动 APP安装完成后,是否可以正常打开,稳定运行 APP的速度是可以让人接受,切换是否流畅 网络异常时,应用是否会崩溃:在请求超时的情况下,如果程序逻辑处理的不好,就有可能发生 ...

  4. uni与小程序,vue的区别

    标签区别 uni使用小程序的标签,vue使用web端的标签 标签名变化的: 标签描述\类别 vue uniapp 文本 span\font text 链接 a navigator/ router-li ...

  5. 团队作业6——Alpha阶段项目复审

    复审人:利国铭 复审人看什么: 软件的质量:解决原计划解决的问题了么,软件运行质量如何?用户有多少,用户反馈如何? 软件工程的质量:代码在哪里? 代码能在新的机器上构建成功么? 代码可维护性如何?每日 ...

  6. Scrum冲刺_Day02

    一.团队展示: 1.项目:light_note备忘录 2.队名:删库跑路队 3.团队成员 队员(不分先后) 项目角色 黄敦鸿 后端工程师.测试 黄华 后端工程师.测试 黄骏鹏 后端工程师.测试 黄源钦 ...

  7. I am George1123!

    我是 George1123,一名来自浙江省,杭州市的初三爆菜 \(\tt oier\) . 以下是蒟蒻逊逊的 OJ 账号: 洛谷 loj uoj bzoj spoj 彩蛋:Welcome to my ...

  8. redis学习之——在分布式数据库中CAP原理CAP+BASE

    分布式系统 分布式系统(distributed system) 由多台计算机和通信的软件组件通过计算机网络连接(本地网络或广域网)组成.分布式系统是建立在网络之上的软件系统.正是因为软件的特性,所以分 ...

  9. 一、本地项目部署到GitHub上

    部署之前准备工作,本地安装Git和注册一个GitHub账号: 本地安装Git 因为官网下载速度较慢,从其他地方下载 https://npm.taobao.org/mirrors/git-for-win ...

  10. 8. 老板 不加薪,我用了 这篇 加了 3K

    在K8S中,容器本身是非持久化的,当容器崩溃后,kubelet将以镜像的初始状态重新启动容器,但是此时之前容器的数据已经丢失,我们该如何保护好容器的数据呢? 在同一Pod中的容器往往需要共享一些数据, ...