Qt基础 | Qt全局定义 | qglobal头文件中的数据类型、函数、宏定义

文章目录

  • 一、数据类型定义
  • 二、函数
  • 三、宏定义

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

详细内容可参考:https://doc.qt.io/qt-5/qtglobal.html

一、数据类型定义

  为了确保在各个平台上各数据类型都有统一确定的长度,Qt为各种常见数据类型定义了类型符号。

typedef signed char qint8;         /* 8 bit signed */
typedef unsigned char quint8;      /* 8 bit unsigned */
typedef short qint16;              /* 16 bit signed */
typedef unsigned short quint16;    /* 16 bit unsigned */
typedef int qint32;                /* 32 bit signed */
typedef unsigned int quint32;      /* 32 bit unsigned */
typedef long long qint64;           /* 64 bit signed */
typedef unsigned long long quint64; /* 64 bit unsigned */
typedef qint64 qlonglong;
typedef quint64 qulonglong;

typedef unsigned char uchar;
typedef unsigned short ushort;
typedef unsigned int uint;

#if defined(QT_COORD_TYPE)
typedef QT_COORD_TYPE qreal;
#else
typedef double qreal;
#endif

qreal缺省是8字节 double 类型浮点数 ,如果 Qt 使用 -qreal float 选项进行配置,就是4字节 float 类型的浮点数。

二、函数

  QtGlobal头文件包含了一些常用函数的定义,这些函数多以模板类型作为参数,返回相应的模板类型,模板类型可以用任何其他类型替换。

QtGlobal中常用函数如下:

image-20240714145840177

image-20240714145903816

三、宏定义

  QtGlobal头文件定义了很多宏,常用的宏如下:

  • QT_VERSION

    • 宏说明:

      QT_VERSION 宏是一个预处理器指令,它提供了一种检查当前编译环境中 Qt 版本的方法。QT_VERSION 这个宏会展开为一个数值,格式是0xMMNNPP(MM是主版本号,NN是次版本号,PP是补丁号),它指定了Qt的版本号。例如,如果你的应用程序是针对Qt 4.1.2编译的,那么QT_VERSION宏将会展开为0x040102。

      可以使用QT_VERSION来使用在可用情况下的最新Qt特性

      示例:

      #if QT_VERSION >= 0x040100
          QIcon icon = style()->standardIcon(QStyle::SP_TrashIcon);
      #else
          QPixmap pixmap = style()->standardPixmap(QStyle::SP_TrashIcon);
          QIcon icon(pixmap);
      #endif
      
    • 用途:

      使用 QT_VERSION 宏可以确保代码在不同版本的 Qt 上都能正确编译和运行。开发者可以根据 Qt 的版本特性编写条件代码,以利用新版本的功能,同时保持对旧版本的兼容性。

  • QT_VERSION_CHECK

    • 宏说明

      QT_VERSION_CHECK 这个宏将版本号的主版本号、次版本号和补丁号转换为一个整数,格式是0xMMNNPP(MM是主版本号,NN是次版本号,PP是补丁号)。

      通过比较 QT_VERSION(当前编译环境中的 Qt 版本)与 QT_VERSION_CHECK 宏生成的版本号,可以决定编译时包含哪些头文件或执行哪些代码。

      示例:

      #include <QtGlobal>
      
      #if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))
      #include <QtWidgets>
      #else
      #include <QtGui>
      #endif
      
  • QT_VERSION_STR

    • 宏说明:

      QT_VERSION_STR 这个宏会展开为一个字符串,表示编译应用程序时所使用的 Qt 版本号。这个字符串通常包含主版本号、次版本号和补丁号,格式为 “X.Y.Z”,其中 X 是主版本号,Y 是次版本号,Z 是补丁号。

  • Q_BYTE_ORDER

    • 宏说明:

      Q_BYTE_ORDER 是 Qt 中的一个宏,用于确定系统在内存中存储数据时使用的字节序。字节序决定了多字节数据类型(如整数、浮点数等)在内存中的字节排列方式。有两种主要的字节序:

      • 大端序(Big-endian):高位字节(即"大端")存储在低地址处。
      • 小端序(Little-endian):低位字节(即"小端")存储在低地址处。

      Q_BYTE_ORDER 宏被 Qt 设置为 Q_LITTLE_ENDIANQ_BIG_ENDIAN 中的一个,以反映当前平台的字节序。

    • 用途:

      • 跨平台开发:在跨平台开发中,了解目标平台的字节序对于处理字节级别的数据交换非常重要。
      • 网络通信:在网络通信中,不同系统间的数据传输需要考虑字节序的差异,以确保数据的正确解析。
      • 文件格式:读写某些文件格式时,可能需要根据字节序调整数据的存储方式。
    • 示例:根据 Q_BYTE_ORDER 的值来执行不同的代码分支

      #if Q_BYTE_ORDER == Q_BIG_ENDIAN
      ...
      #endif
      
      #if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
      ...
      #endif
      
    • 注意事项:

      • 大多数现代桌面和服务器系统(如 x86 和 x86_64 架构)使用小端序。
      • 某些嵌入式系统或特定的硬件平台可能使用大端序。
      • 在处理网络协议或与其他系统交换数据时,了解并正确处理字节序差异是非常重要的。
  • Q_BIG_ENDIAN

    • 宏说明

      Q_BIG_ENDIAN宏与 Q_BYTE_ORDER 宏进行比较,以确定系统的字节顺序。

  • Q_LITTLE_ENDIAN

    • 宏说明:

      Q_LITTLE_ENDIAN宏与 Q_BYTE_ORDER 宏进行比较,以确定系统的字节顺序。

  • Q_DECL_EXPORT和Q_DECL_IMPORT

    • 宏说明:

      在使用或设计共享库时,用于导入或导出库的内容

      Q_DECL_EXPORTQ_DECL_IMPORT 是 Qt 框架中用于处理共享库(shared libraries,也称为动态链接库 dynamic link libraries,DLLs)的宏。它们用于标识哪些符号(通常是类、函数或变量)应该被导出(export)或导入(import)到共享库中。

  • Q_UNUSED(name)

    • 宏说明:

      用来指示编译器某个参数在函数体中没有被使用。这主要用于两个场景:

      1. 避免编译器警告:当函数签名中包含参数,但这些参数在函数实现中并未使用时,某些编译器可能会发出未使用参数的警告。使用 Q_UNUSED 可以告诉编译器这些参数是故意不被使用的,从而避免这类警告。
      2. 保持有意义的参数名:即使参数在当前函数实现中没有使用,保留参数名也可能是有意义的,因为它们可以提供关于函数预期行为的信息,或者为将来可能的代码更改保留接口。使用 Q_UNUSED 可以在不使用参数的情况下保留这些有意义的参数名。
  • foreach(variable, container)

    • 宏说明:

      用于实现 Qt 的 foreach 循环。这个循环语法是 Qt 的一个特性,允许以一种简洁的方式遍历 Qt 容器(如 QListQVectorQString 等)。

      foreach 宏的使用方式如下:

      • variable:循环中当前元素的变量名或变量定义。
      • container:要遍历的 Qt 容器,其值类型应与变量的类型相对应。
    • 示例:

      QList<int> list;
      // 填充 list ...
      
      // 使用 foreach 宏遍历 list
      foreach(int number, list) {
          qDebug() << number;
      }
      
    • 注意事项:

      • foreach 宏可能会引起命名空间污染,因为它定义了一个全局的 foreach 标识符。如果你担心这个问题,可以通过在 Qt 的 .pro 文件中添加以下行来禁用 foreach 宏:

        CONFIG += no_keywords
        
      • 自 Qt 5.7 起,使用 foreach 宏被官方不推荐,因为它将在未来的 Qt 版本中被移除。Qt 推荐使用 C++11 引入的 for 循环语法作为替代

        QList<int> list;
        // 填充 list ...
        
        // 使用 C++11 的 range-based for loop 遍历 list
        for(int number : list) {
            qDebug() << number;
        }
        
  • forever

    • 宏说明:

      forever 这个宏提供了一种方便的方式来编写无限循环。如:

      forever {
          ...
      }
      

      等价于

      for (;;) {
          ...
      }
      
    • 注意事项:

      如果你担心命名空间污染,你可以通过在你的 .pro 文件中添加以下行来禁用这个宏:

      CONFIG += no_keywords
      
  • qDebug(const char *message, )

    • 宏说明:

      用于输出调试信息。允许开发者在开发过程中输出变量值、程序状态或其他信息,以便于调试应用程序。

      如果在编译时定义了 QT_NO_DEBUG_OUTPUT,则 qDebug 函数将不执行任何操作。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【扩散模型(五)】IP-Adapter 源码详解3-推理代码

系列文章目录 【扩散模型&#xff08;一&#xff09;】中介绍了 Stable Diffusion 可以被理解为重建分支&#xff08;reconstruction branch&#xff09;和条件分支&#xff08;condition branch&#xff09;【扩散模型&#xff08;二&#xff09;】IP-Adapter 从条件分支的视…

花几千上万学习Java,真没必要!(十一)

1、跳转控制语句&#xff1a; 测试代码1&#xff1a; package com.continuetest; public class ControlFlowDemo { // break语句 public void demonstrateBreak() { for (int i 0; i < 10; i) { if (i 5) { break; // 当i等于5时&#xff0c;跳出循环 } System.o…

【眼疾病识别】图像识别+深度学习技术+人工智能+卷积神经网络算法+计算机课设+Python+TensorFlow

一、项目介绍 眼疾识别系统&#xff0c;使用Python作为主要编程语言进行开发&#xff0c;基于深度学习等技术使用TensorFlow搭建ResNet50卷积神经网络算法&#xff0c;通过对眼疾图片4种数据集进行训练&#xff08;‘白内障’, ‘糖尿病性视网膜病变’, ‘青光眼’, ‘正常’&…

项目管理进阶之RACI矩阵

前言 项目管理进阶系列续新篇。 RACI&#xff1f;这个是什么矩阵&#xff0c;有什么用途&#xff1f; 在项目管理过程中&#xff0c;如Team规模超5以上时&#xff0c;则有必要采用科学的管理方式&#xff0c;满足工作需要。否则可能事倍功半。 Q&#xff1a;什么是RACI矩阵 …

SongComposer:让大模型像人类一样具有音乐创作力

人工智能咨询培训老师叶梓 转载标明出处 大模型在翻译、复杂语言环境中的推理等任务中展现出了人类级别的能力。这引发了一个问题&#xff1a;这些模型能否在更具情感、抽象性以及需要专业技能的领域中&#xff0c;如音乐创作&#xff0c;展现出人类的创造力呢&#xff1f;香港…

一招轻松解决猫毛 最值得买的浮毛空气净化器排名

作为一名6年资深铲屎官&#xff0c;我常常被朋友问到关于宠物空气净化器的各种问题。有的人认为这是个神器&#xff0c;而有的人则认为这完全是花钱买智商税。其实我刚开始对购买宠物空气净化器也持怀疑态度&#xff0c;心想这么多钱花下去真的有效吗&#xff1f;但使用后&…

Linux文本工具之-Vim(二)

一、编辑 快捷键功能描述i在当前光标所在位置插入&#xff0c;光标后的文本相应向右移动I在光标所在行的行首插入&#xff0c;行首是该行的第一个非空白字符&#xff0c;相当于光标移动到行首执行 i 命令o在光标所在行的下插入新的一行。光标停在空行首&#xff0c;等待输入文…

王牌站士Ⅶ--理解大型语言模型LLM的参数

模型的大小并不一定决定其成功 在学习任何大型语言模型 (LLM) 时&#xff0c;您首先会听到的事情之一就是给定模型有多少个参数。如果您查看下面的图表&#xff0c;您会注意到参数大小范围很广 - 一个模型可能有 10 亿或 20 亿个参数&#xff0c;也可能有超过 1.75 万亿个参数。…

MongoDB综合实战篇(超容易)

一、题目引入 在MongoDB的gk集合里插入以下数据&#xff1a; 用语句完成如下功能&#xff1a; &#xff08;1&#xff09;查询张三同学的成绩信息 &#xff08;2&#xff09;查询李四同学的语文成绩 &#xff08;3&#xff09;查询没有选化学的同学 &#xff08;4&#xf…

EasyPhoto - 一键训练并生成人像写真,支持参考图生成 独立版 本地一键整合包下载

EasyPhoto最早是作为AI绘画软件StableDiffusion的一款插件备受大家喜爱&#xff0c;今天分享的是 EasyPhoto 的独立版本一键整合包&#xff0c;无需安装StableDiffusion即可解压即用。 和之前分享的腾讯开源的 PhotoMaker 和 阿里开源的 FaceChain 类似&#xff0c;EasyPhoto操…

ArkUI组件——循环控制/List

循环控制 class Item{name: stringprice:number}private items:Array<Item> [new Item("A0",2399),new Item("BE",1999),new Item("Ro",2799)] ForEach(this.items,(item:Item) > {})List组件 列表List是一种复杂的容器&#xff0c;…

C++动态内存的管理

今天来分享C动态内存管理相关知识&#xff0c;闲言勿谈&#xff0c;直接上干货。 1. 动态内存的开辟和销毁(new和delete) (1)前置知识&#xff1a;我们知道c语言有malloc和calloc和realloc三个函数可以进行动态的开辟内存&#xff0c;那么它们有什么区别呢&#xff1f;首先是…

乘积量化pq:将高维向量压缩 97%

向量相似性搜索在处理大规模数据集时&#xff0c;往往面临着内存消耗的挑战。例如&#xff0c;即使是一个包含100万个密集向量的小数据集&#xff0c;其索引也可能需要数GB的内存。随着数据集规模的增长&#xff0c;尤其是高维数据&#xff0c;内存使用量会迅速增加&#xff0c…

自适应巡航控制(ACC)功能—巡航车速控制功能介绍

自适应巡航控制中的跟车行驶功能详解 自适应巡航控制&#xff08;ACC&#xff09;功能—巡航车速控制功能介绍 自适应巡航控制&#xff08;ACC&#xff09;中的跟车车距控制功能&#xff1a;详解与应用 自适应巡航控制中的Cut in & Cut out功能详解 自适应巡航控制中的Stop…

为什么在芯片制造中不能用机械磨削(grinding)代替cmp?

知识星球里的学员问&#xff1a;为什么只有在晶圆背面减薄时会使用griniding工艺&#xff1f;在芯片制程中并未看到该工艺&#xff0c;同样有减薄作用&#xff0c;为什么在芯片制程中用的是cmp&#xff1f; Grinding与cmp的原理&#xff1f; Grinding&#xff0c;机械磨削&…

AV1技术学习:Affine Motion Compensation

一、Affine Model Parameter 除了传统的平移运动补偿&#xff0c;AV1 还支持仿射变换模型&#xff0c;将当前像素点 (x, y) 通过以下方式投影到参考帧中的预测像素点 (x, y). 参数 (h13, h23) 对应于平移模型中使用的常规运动向量。 参数 h11 和 h22 控制垂直和水平轴上的比例…

【React笔记初学总结一】React新手的学习流程笔记总结,掰开了揉碎了,下载安装基础结构学习

REACT学习记录 一、React是什么&#xff1a;二、尝试安装下载&#xff1a;三、理解都有什么四、基础网页学习&#xff1a;1.几个比较重要的资源包例子2.第一个react示例&#xff1a;&#xff08;掰开了揉碎了&#xff0c;咱们先看懂它最简单的结构&#xff09;3.第二个react示例…

【数学建模】高温作业专用服装设计(2018A)隐式差分推导

为方便计算&#xff0c;对区域进行离散化处理&#xff0c;采用隐式差分格式进行离散计算。隐式差分格式如图&#xff1a; 每层材料内部 对第 j j j层材料: 其中&#xff0c; λ j \lambda_j λj​表示第 j j j层的热扩散率&#xff0c; c j c_j cj​表示第 j j j层的比热容…

每日练习,不要放弃

目录 题目1.下面叙述错误的是 ( )2.java如何返回request范围内存在的对象&#xff1f;3.以下代码将打印出4.下列类定义中哪些是合法的抽象类的定义&#xff1f;&#xff08;&#xff09;5.以下代码段执行后的输出结果为6.以下代码运行输出的是总结 题目 选自牛客网 1.下面叙述…

Java 快速入门学习 -- Day 2

Java 快速入门 Ⅱ maven&#xff08;图书管理员&#xff09;IDEA使用 maven框架 maven&#xff08;图书管理员&#xff09; maven 仓库&#xff0c;图书馆。要看书的化先从家里找&#xff08;本地仓库&#xff09;&#xff0c;本地找不到就去中央仓库或者镜像仓库找&#xff0c…