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 函数将不执行任何操作。

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-17 06:42:03       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-17 06:42:03       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-17 06:42:03       58 阅读
  4. Python语言-面向对象

    2024-07-17 06:42:03       69 阅读

热门阅读

  1. 【云原生网络CNI】容器网络接口CNI的使用和管理

    2024-07-17 06:42:03       27 阅读
  2. 索引是什么

    2024-07-17 06:42:03       22 阅读
  3. 前端路由实现

    2024-07-17 06:42:03       24 阅读
  4. 如何使用ASPICE?

    2024-07-17 06:42:03       25 阅读
  5. 论文调研_组件识别相关

    2024-07-17 06:42:03       32 阅读
  6. minimap2安装与使用(v 2.28)生物信息学工具26

    2024-07-17 06:42:03       24 阅读
  7. CSS 导航栏:设计、定制与优化

    2024-07-17 06:42:03       24 阅读
  8. 用python写一个tcp/ip协议的聊天软件

    2024-07-17 06:42:03       24 阅读
  9. STM32微控制器的高级控制算法(内附资料)

    2024-07-17 06:42:03       29 阅读
  10. Python编码规范详解

    2024-07-17 06:42:03       22 阅读