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 >= 0x040100QIcon icon = style()->standardIcon(QStyle::SP_TrashIcon);
      #elseQPixmap 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://xiahunao.cn/news/3246713.html

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

相关文章

《Python机器学习项目实战》书籍介绍

文章目录 书籍介绍主要内容书籍目录 书籍介绍 《Python机器学习项目实战》带领大家在构建实际项目的过程中&#xff0c;掌握关键的机器学习概念&#xff01;使用机器学习&#xff0c;我们可完成客户行为分析、价格趋势预测、风险评估等任务。要想掌握机器学习&#xff0c;需要…

2024年大数据高频面试题(中篇)

文章目录 Kafka为什么要用消息队列为什么选择了kafkakafka的组件与作用(架构)kafka为什么要分区Kafka生产者分区策略kafka的数据可靠性怎么保证ack应答机制(可问:造成数据重复和丢失的相关问题)副本数据同步策略ISRkafka的副本机制kafka的消费分区分配策略Range分区分配策略…

网络准入控制设备是什么?有哪些?网络准入设备臻品优选

小李&#xff1a;“小张&#xff0c;最近公司网络频繁遭遇外部攻击&#xff0c;我们得加强一下网络安全了。” 小张&#xff1a;“是啊&#xff0c;我听说实施网络准入控制是个不错的选择。但具体什么是网络准入控制设备&#xff1f;我们有哪些选择呢&#xff1f;” 小李微笑…

数据结构历年考研真题对应知识点(哈夫曼树和哈夫曼编码)

目录 5.5.1哈夫曼树和哈夫曼编码 1.哈夫曼树的定义 2.哈夫曼树的构造 【分析哈夫曼树的路径上权值序列的合法性&#xff08;2010&#xff09;】 【哈夫曼树的性质&#xff08;2010、2019&#xff09;】 3.哈夫曼编码 【根据哈夫曼编码对编码序列进行译码&#xff08;201…

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

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

达梦 ./disql SYSDBA/SYSDBA报错[-70028]:创建SOCKET连接失败. 解决方法

原因 达梦命令./disql SYSDBA/SYSDBA默认访问端口5236&#xff0c;如果初始化实例的时候修改了端口&#xff0c;需要指定端口访问 解决 ./disql SYSDBA/SYSDBA192.168.10.123:5237

数据结构(5.2_1)——二叉树的基本定义和术语

二叉树的基本概念 二叉树是n(n>0)个结点的有限集合: 或者为空二叉树&#xff0c;即n0&#xff1b;或者由一个根结点和两个互不相交的被称为根的左子树和右子树组成。左子树和右子树又分别是一颗二叉树。 特点:每个结点至多只有两颗字数&#xff1b;左子树不能颠倒(二叉树…

09 深度推荐模型演化中的“平衡与不平衡“规律

你好&#xff0c;我是大壮。08 讲我们介绍了深度推荐算法中的范式方法&#xff0c;并简单讲解了组合范式推荐方法&#xff0c;其中还提到了多层感知器&#xff08;MLP&#xff09;。因此&#xff0c;这一讲我们就以 MLP 组件为基础&#xff0c;讲解深度学习范式的其他组合推荐方…

pico+unity3d手部动画

在 Unity 开发中&#xff0c;输入系统的选择和运用对于实现丰富的交互体验至关重要。本文将深入探讨 Unity 中的 Input System 和 XR Input Subsystem 这两种不同的输入系统&#xff0c;并详细介绍它们在控制手部动画方面的应用。 一、Input System 和 XR Input Subsystem 的区…

每日练习,不要放弃

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

【node-RED 4.0.2】连接操作 Oracle 数据库实现 增 删 改 查【新版,使用新插件:@hylink/node-red-oracle】

总览 上节课&#xff0c;我们说到&#xff0c;在 node-red 上链接 oracle 数据库 我们使用的插件是 node-red-contrib-agur-connector。 其实后来我发现&#xff0c;有一个插件更简便&#xff0c;并且也更好用&#xff1a;hylink/node-red-oracle &#xff01;&#xff01;&am…

Linux--网络基础

计算机网络背景 计算机网络背景是一个复杂而丰富的领域&#xff0c;涵盖了从计算机单机模式到网络互联的演变过程&#xff0c;以及网络技术的不断发展和创新。 计算机单机模式和独立发展 在早期&#xff0c;计算机主要以单机模式存在&#xff0c;即每台计算机都是独立的&…

传知代码-揭秘AI如何揪出图片中的“李鬼”(论文复现)

代码以及视频讲解 本文所涉及所有资源均在传知代码平台可获取 文字篡改图像的“照妖镜”&#xff1a;揭秘AI如何揪出图片中的“李鬼” 在数字化时代&#xff0c;我们时常被各种图像信息所包围。然而&#xff0c;这些图像中有时隐藏着不为人知的秘密——被篡改的文字或图像。这…

C++ | Leetcode C++题解之第238题除自身以外数组的乘积

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> productExceptSelf(vector<int>& nums) {int length nums.size();// L 和 R 分别表示左右两侧的乘积列表vector<int> L(length, 0), R(length, 0);vector<int> answer(l…

188数码管轮询扫描

前言 最近用到了188数码管&#xff0c;总结一下。 188数码管&#xff0c;用5个IO&#xff0c;在不借助外部驱动芯片的情况下&#xff0c;可以点亮20个灯。188数码管广泛应用于电子烟、充电器、充电宝、DVD、高级音响、工业设备控制面板、医疗器械等多个领域&#xff0c;满足不…

【iOS】——TaggedPointer

TaggedPointer介绍 在为了改进从 32位CPU 迁移到 64位CPU 的内存浪费和效率问题&#xff0c;在 64位CPU 环境下&#xff0c;引入了 Tagged Pointer 。旨在提高内存效率和运行性能&#xff0c;尤其针对小的、频繁使用的对象&#xff0c;如NSNumber, NSDate, 和NSString等。在64…

昇思学习打卡-19-生成式/Pix2Pix实现图像转换

文章目录 网络介绍训练推理结果 网络介绍 Pix2Pix是基于条件生成对抗网络&#xff08;cGAN, Condition Generative Adversarial Networks &#xff09;实现的一种深度学习图像转换模型&#xff0c;可以实现语义/标签到真实图片、灰度图到彩色图、航空图到地图、白天到黑夜、线…

mmdetection

首先下载mmdetection 3.2.0版本的 https://github.com/open-mmlab/mmdetection/tree/v3.2.0 第二步&#xff1a;创建虚拟环境 conda create -n mmdetection python3.8 -y conda activate mmdetection第三步&#xff1a;安装包 pip install torch2.0.1cu118 -f https://downl…

【c++】新领域:“智能数组 ” 问世

引入: 大家有没有发现每次创建和使用数组时很麻烦,因为数组长度一般只能用静态常量,太过局限,不满足大部分开发者的需求。而且遍历数组也很麻烦,又要for循环,又要在其他使用数组的地方检查边界。 于是我就构想了一种“智能数组” 就解决了大部分的难题 这样的语言风格是…