03-2_Qt 5.9 C++开发指南_Qt全局定义、容器类、容器类的迭代器、Qt类库的模块

news2024/11/17 0:27:21

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

文章目录

  • 1.Qt全局定义
    • 1.1 数据类型定义
    • 1.2 函数
    • 1.3 宏定义
      • 1.3.1 QT_VERSION
      • 1.3.2 QT_VERSION_CHECK
      • 1.3.3 QT_VERSION_STR
      • 1.3.4 Q_BYTE_ORDER、Q_BIG_ENDIAN 和 Q_LITTLE_ENDIAN
      • 1.3.5 Q_DECL_IMPORT 和Q_DECL_EXPORT
      • 1.3.6 Q_DECL_OVERRIDE
      • 1.3.7 Q_DECL_FINAL
      • 1.3.8 Q_UNUSED(name)
      • 1.3.9 foreach(variable,container)
      • 1.3.10 forever
      • 1.3.11 qDebug(const char* message, ...)
  • 2. 容器类
    • 2.1 容器类概述
    • 2.2 顺序容器类
      • 2.2.1 QList
      • 2.2.2 QlinkedList
      • 2.2.3 QVector
      • 2.2.4 QStack
      • 2.2.5 QQueue
    • 2.3 关联容器类
      • 2.3.1 QSet
      • 2.3.2 QMap
      • 2.3.3 QMultiMap
      • 2.3.4 QHash
      • 2.3.5 QMultiHash
  • 3. 容器类的迭代
    • 3.1 Java 类型的迭代器
    • 3.2 STL 类型的迭代器
    • 3.3 foreach关键字
  • 4. Qt类库的模块

1.Qt全局定义

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

1.1 数据类型定义

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

1.2 函数

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

1.3 宏定义

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

1.3.1 QT_VERSION

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

1.3.2 QT_VERSION_CHECK

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

1.3.3 QT_VERSION_STR

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

1.3.4 Q_BYTE_ORDER、Q_BIG_ENDIAN 和 Q_LITTLE_ENDIAN

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

1.3.5 Q_DECL_IMPORT 和Q_DECL_EXPORT

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

1.3.6 Q_DECL_OVERRIDE

在类定义中,用于重载一个虚函数,例如子啊某个类中重载虚函数paintEvent(),可以定义如下:
void paintEvent(QPaintEvent*) Q_DECL_OVERRIDE;
使用Q_DECL_OVERRIDE宏后,如果重载的虚函数没有进行任何重载操作,编译器将会报错。

1.3.7 Q_DECL_FINAL

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

1.3.8 Q_UNUSED(name)

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

1.3.9 foreach(variable,container)

用于容器类的遍历

1.3.10 forever

用于构造一个无限循环

1.3.11 qDebug(const char* message, …)

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

2. 容器类

2.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.2 顺序容器类

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

2.2.1 QList

是最常用的容器类,虽然它是以数组列表 (array-list)的形式实现的,并基于索引访问(index-based),但是在其前或后添加数据非常快,QList 以下标索引的方式对数据项进行访问。
QList 用于添加、插入、替换、移动、删除数据项的函数有: insert()、replace()、removeAt()、move()、swap()、append()、prepend()、removeFirst()和 removeLast()等。
QList 提供下标索引方式访问数据项,如同数组一样,也提供 at()函数

2.2.2 QlinkedList

QLinkedList是链式列表 (linked-list),数据项不是用连续的内存存储的,它基于选代器访问数据项,并且插入和删除数据项的操作时间相同。
除了不提供基于下标索引的数据项访问外,QLinkedList 的其他接口函数与 QList 基本相同

2.2.3 QVector

QVector提供动态数组的功能,以下标索引访问数据。
QVector 的函数接口与 QList 乎完全相同,QVector的性能比 QList更高,因为QVector的数据项是连续存储的。

2.2.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

2.2.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

2.3 关联容器类

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

2.3.1 QSet

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

2.3.2 QMap

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

2.3.3 QMultiMap

QMultiMap 是QMap 的子类,是用于处理多值映射的便利类。
多值映射就是一个键可以对应多个值。QMap 正常情况下不允许多值映射,除非使用QMap::insertMulti0添加键值对。

2.3.4 QHash

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

  • QHash 比 QMap 的查找速度快;
  • 在QMap 上遍历时,数据项是按照键排序的,而QHash 的数据项是任意顺序的;
  • QMap 的键必须提供“<”运算符,QHash 的键必须提供“==”运算符和一个名称为qHash()的全局散列函数。

2.3.5 QMultiHash

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

3. 容器类的迭代

  • 迭代器 (iterator)为访问容器类里的数据项提供了统一的方法,Qt 有两种迭代器类: Java 类型的迭代器STL类型的选代器
  • Java 类型的迭代器更易于使用,且提供一些高级功能,而 STL类型的迭代器效率更高。
  • Qt还提供一个关键字 foreach (实际是< QtGlobal >里定义的一个宏)用于方便地访问容器里所有数据项。

3.1 Java 类型的迭代器

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

3.2 STL 类型的迭代器

对于每一个容器类,都有两个 STL 类型选代器:一个用于只读访问,一个用于读写访问。无需修改数据时一定使用只读迭代器,因为它们速度更快。
STL迭代器与 Qt和STL的原生算法兼容,并且进行了速度优化。具体类型见下表,具体使用详见《Qt5.9 c++开发指南》。
在这里插入图片描述

3.3 foreach关键字

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

foreach (variable, container)

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

QLinkedList<QString> list;
...
QString str;
foreach (str,list)
gDebug() << str;

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

4. 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++开发指南》。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/734661.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

绘制等厚度图

clc;clear;close all; data xlsread(BRENT层等厚度.xlsx); x data(:,1) xmax max(x); xmin min(x); y data(:,2) ymax max(y); ymin min(y); z data(:,3); N 45; …

为什么没有getter方法无法成功返回new对象的json格式(chatgpt谬论)

标题防止太长所以精炼了些。springboot项目&#xff0c;restful风格下面&#xff0c;我们如果返回的是一个new的实体类对象是什么情况。 restful风格其实是要将返回的数据封装为json的&#xff0c;它是要去这样封装的。但是如果你不提供对象的get方法其实是没法返回的。接口测试…

数据库的备份与恢复(超详细讲解)

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于MySQL数据库的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.数据库的备份与恢复是什么 二. …

5. Redis优化秒杀、Redis消息队列实现异步秒杀

文章目录 Redis优化秒杀、Redis消息队列实现异步秒杀一、秒杀优化1.1 回顾“一人一单”秒杀业务代码1.2 异步秒杀思路1.3 基于Redis完成秒杀资格判断1.3.1 修改VoucherServiceImpl1.3.2 Lua脚本编写1.3.3 Redislua判断用户是否抢购成功1.3.4 基于阻塞队列实现异步秒杀下单1.3.4…

Java024——String类

一、String类简单说明 1、单个字符可以用char类型保存&#xff0c;多个字符组成的文本就需要保存在String 对象中。 2、String是Java中的一个类 3、String 通常被称为字符串&#xff0c;一个String对象最多可以保存(2^32-1)个字节(占用4GB空间大小)的文本内容。 二、String类…

Jmeter 压测工具的安装及使用

目录 一、简介二、下载三、安装四、启动五、使用1.调整界面显示大小2.改为中文&#xff08;选&#xff09;3.添加线程组4.添加 HTTP 请求5.添加 HTTP 请求头6.保存压测配置7.启动压测8.查看结果树9.查看聚合报告 一、简介 官网地址&#xff1a; https://jmeter.apache.org/ JM…

HTML案例:滚动条下拉后导航栏有网格状效果

案例&#xff1a;在滚动条下拉的时候&#xff0c;导航栏是固定的&#xff0c;当下拉卷出的内容在导航条的范围内时&#xff0c;导航条的背景虚化为卷出的内容 固定定位的效果 需求效果&#xff1a; 1、HTML代码 <style>* {margin: 0;padding: 0;}nav {/* 固定定位 */pos…

穷且益坚,不坠青云之志——忆我的大学四年

文章目录 一、前言二、大学之前1.从小的经历以及家庭的困境2.一切的根源——自卑3.不愉快的初高中经历 三、大一&#xff1a;所谓追梦——改变的起点1.敏感而自卑的内心2.百团大战&#xff0c;与协会埋下不解之缘3.改变的契机——追梦App4.持续的学习&#xff0c;热爱铸就改变5…

vscode安装+配置+使用+调试【保姆级教程】

1. VScode是什么 Visual Studio Code简称VS Code&#xff0c;是一款跨平台的、免费且开源的现代轻量级代码编辑器&#xff0c;支持几乎主流开发语言的语法高亮、智能代码补全、自定义快捷键、括号匹配和颜色区分、代码片段提示、代码对比等特性&#xff0c;也拥有对git的开箱即…

Django_发送邮件

目录 一、开启SMTP服务并获取授权码 二、在Django的配置文件中添加邮箱服务配置 三、发送邮箱代码 源码等资料获取方法 使用django邮箱功能需要搭建smtp服务器&#xff0c;如果没有&#xff0c;可以使用第三方smtp服务器。 本文以第三方QQ邮箱服务器演示如何使用python的s…

从钢铁行业数字化管控平台的智能进化,看超自动化能力边界

文/王吉伟 钢铁行业的数字化转型&#xff0c;历来都是值得探讨的热点话题。 2022年&#xff0c;我国粗钢产量10.13亿吨&#xff0c;占据了全球钢铁供给市场的半壁江山。 这组数据可谓非常抢眼&#xff0c;但仍旧难掩诸多企业的各种经营问题。 钢铁生产过程工序众多&#xf…

CentOS环境下的JDK8安装

CentOS 安装 JDK8 安装JDK8 下载 官网&#xff1a;https://www.oracle.com/java/technologies/downloads/#java8-linux 将下载好的压缩包拷贝到根目录下 通过xshell如果出现 bash: rz: 未找到命令 &#xff0c;需要先运行下面的命令 yum -y install lrzsz解压 tar -zxvf …

ubuntu彻底卸载libreoffice和安装wps

一.卸载libreoffice 1. 打开ubuntu桌面&#xff0c;右键 打开终端 方法一 完全卸载 sudo apt-get remove libreoffice-common 根据提示输入管理员密码&#xff0c;然后根据提示 输入 Y 这样&#xff0c;等待卸载完成。 正常情况下上述命令执行完成后Libreffice的表格、绘图…

DevOps基础服务1——版本控制gitlab

文章目录 一、基本了解1.1 安装git客户端1.2 git命令1.2.1 本地仓库1.2.2 远程仓库 二、安装gitlab三、功能管理3.1 创建账号3.2 用户注册授权通知功能3.3 创建项目远程库3.4 ssh设置3.5 克隆远程库项目到本地3.6 上传本地项目代码到远程库3.7 授权用户查看项目权限 一、基本了…

华为OD机试真题 Java 实现【查找树中元素】【2023 B卷 100分】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描述四、补充说明五、Java算法源码六、效果展示1、输入2、输出 一、题目描述 已知树形结构的所有节点信息&#xff0c;现要求根据输入坐标&#xff08;x,y&#xff09;找到该节点保存的内容值&#xff1b; 其中&#xff1a; x表示节点…

光场1.0——非聚焦型光场相机

本文概要 本文讲主要从光场硬件结构设计以及软件处理方式的层面来介绍一下光场的相关内容&#xff0c;关于光场的优势和具体应用点并不在本文的主要范围内。 光场1.0 1. 结构原理说明 首先来介绍一下光场相机&#xff0c;那么什么是光场相机呢&#xff0c;光场相机经历了两…

c语言实现单链表

#include<stdio.h> #include<malloc.h>typedef struct LNode{double data;struct LNode *next; }LNode,*LinkList;bool InitList(LinkList &L){L(LNode*) malloc(sizeof(LNode));//分配一个头结点 if(LNULL) //内存不足&#xff0c;分配失败 return false;L-&g…

机器学习与深度学习——自定义函数进行线性回归模型

机器学习与深度学习——自定义函数进行线性回归模型 目的与要求 1、通过自定义函数进行线性回归模型对boston数据集前两个维度的数据进行模型训练并画出SSE和Epoch曲线图&#xff0c;画出真实值和预测值的散点图&#xff0c;最后进行二维和三维度可视化展示数据区域。 2、通过…

day68_Vue基础

今日内容 零、 复习昨日 零、 复习昨日 一、Vue简介 1.1 简介 Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式的js框架&#xff0c;发布于 2014 年 2 月。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注…

100、基于STM32单片机自动跟随小车 红外遥控控制小车避障模式 跟随模式设计(程序+原理图+PCB源文件+流程图+硬件设计资料+元器件清单等)

绪 论 智能小车通过各种感应器获得外部环境信息和内部运动状态&#xff0c;实现在复杂环境背景下的自主运动&#xff0c;从而完成具有特定功能的机器人系统。而随着智能化电器时代的到来&#xff0c;它们在为人们提供的舒适的生活环境的同时&#xff0c;也提高了制造智能化电器…