1 前言
这一章主要介绍Qt包含的数据类型和迭代器,C/C++有自己的的标准类型和迭代器,Qt也有它自身包装的独特类型如qint8、qint64等和相关Qt包装实用的迭代器,究竟如何使用呢?我们先从QtGlobal 这个头文件开始入手
2 QtGlobal介绍
<QtGlobal> 头文件包含基本的全局声明(包括基本数据类型、函数和宏)。并且它包含在大多数其他Qt头文件中,所以不用显式包含这个头文件也可以使用其中的定义。
2.1 QtGlobal包含的数据类型定义
为了确保在各个平台上各数据类型都有统一确定的长度,Qt为各种常见数据类型定义了类型,
符号,如 qint8 就是 signed char 的类型定义,即:
typedef signed char qint8;
Qt说明使用是:这种类型在Qt支持的所有平台上都保证是8位的。
<QtGlobal> 中定义的常用数据类型见下表:
Qt 数据类型 | 等效定义 | 字节数 | 说明 |
qint8 | signed char | 1 | 这种类型在Qt支持的所有平台上都保证是8位的 |
qint16 | signed short | 2 | 在Qt支持的所有平台上,该类型保证为16位。 |
qint32 | signed int | 4 | 在Qt支持的所有平台上,这种类型保证是32位的。 |
qint64 | long long int (__int64 on Windows) | 8 | 在Qt支持的所有平台上,该类型保证是64位的。 |
qintptr | signed int * | 4 | 整型,用于在有符号整数中表示指针(对于哈希等很有用)。在一个有64位指针的系统上,qintptr是qint64的类型定义。 |
qlonglong | long long int (__int64 on Windows) | 8 | 这个和qint64一样 |
quint8 | unsigned char | 1 | 这种类型在Qt支持的所有平台上都保证是8位的。 |
quint16 | unsigned short | 2 | 在Qt支持的所有平台上,该类型保证为16位。 |
quint32 | unsigned int | 4 | 在Qt支持的所有平台上,这种类型保证是32位的。 |
quint64 | unsigned long long int (unsigned __int64 on Windows) | 8 | 在Qt支持的所有平台上,该类型保证是64位的。 |
qulonglong | unsigned long long int (unsigned __int64 on Windows) | 8 | 这个和quint64一样。 |
uchar | unsigned char | 1 | 同quint8 |
ushort | unsigned short | 2 | 同quint16 |
uint | unsigned int | 4 | 同quint32 |
ulong | unsigned long | 8 | quint64 |
qreal | double | 8 | |
qfloat16 | 2 | ||
qsizetype | size_t | 在Qt支持的所有平台上,该类型保证与size_t的大小相同。 |
其中qreal缺省是8字节double类型浮点数,如果Qt使用-qreal float 选项进行配置,就是4字节float类型的浮点数。
qfloat16是Qt 5.9.0 中新增的一个类,用于表示16位的浮点数,要使用qfloat16,需要包含头文件。文档下图说明
2.2 QtGlobal包含的方法
头文件包含–些常用函数的定义,这些函数多以模板类型作为参数,返回相应的
模板类型,模板类型可以用任何其他类型替换。若是以double或float类型数作为参数的,一般有两个参数版本的同名函数,如qFuzzyIsNull(double d)和qFuzzyIsNul(float f)。
下表是 <QtGlobal> 中常用的全局函数定义,列出了函数的输入和输出参数(若存在double和float两种参数版本,只列出double 类型参数的版本)。都是我辛辛苦苦从Qt文档
整理出来的,实际项目中使用会非常方便!
函数 | 功能 |
T qAbs(const T &t) | 返回变量value的绝对值 |
const T &qBound(const T &min, const T &value, const T &max) | 返回value限定在min至max范围之内的值 |
bool qFuzzyCompare( double p1, doublc p2) | 若p1和p2近似相等,返回true |
bool qFuzzyIsNull(double d) | 如果参数d约等于0,返回true |
double qInf() | 返回无穷大的数 |
bool qIsFinite(double d) | 若d是一个有限的数,返回true |
bool qIsInf(double d) | 若d是一个无限大的数,返回true |
bool qIsNaN(double d) | 若d不是一个数,返回true |
const T &qMax(const T &value1, const T &value2) | 返回valuel和value2中较大的值 |
const T &qMin(const T &valuel, const T &value2) | 返回value1和value2中较小的值 |
qint64 qRound64(double value) | 将value近似为最接近的qint64 整数 |
int qRound(double value) | 将value近似为最接近的int整数 |
int qrand() | 标准C++中rand()函数的线程安全型版本,返回0至RAND_ MAX之间的伪随机数 |
void qsrand(uint seed) | 标准C++中srand()函数的线程安全型版本,使用种子seed对伪随机数序列初始化 |
还有一些基础的数学运算函数在 <QtMath> 头文件中定义,比如三角运算函数、弧度与角度之间的转换函数等。可以自行查阅文档,都有详细说明
2.3 QtGlobal包含的宏定义
<QtGlobal>头文件 中定义了很多宏,以下一些是比较常用的:
- QT_VERSION
这个宏展开为数值形式0xMMNNPP (MM = major, NN = minor, PP = patch) 表示Qt编译器版本,例如Qt编译器版本为Qt5.12.9,则QT_ VERSION为0x051209。这个宏常用于条件编译设置,根据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_CHECK
这个宏展开为Qt版本号的一个整数表示,例如:
#include <QtGlobal>
#if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))
#include <QtWidgets>
#else
#include <QtGui>
#endif
- QT_VERSION_STR
这个宏展开为Qt版本号的字符串,如 “5.12.9”。 - Q_BYTE_ORDER、Q_BIG_ENDIAN和Q_LITTLE_ENDIAN
Q_ BYTE_ ORDER表示系统内存中数据的字节序,Q BIG ENDIAN表示大端字节序,Q_LITTLE_ENDIAN表示小端字节序。在需要判断系统字节序时会用到,例如:
#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
...
#endif
- Q_DECL IMPORT和Q_DECL EXPORT
在使用或设计共享库时,用于导入或导出库的内容,后面有具体章节使用其实例。 - Q_DECL_OVERRIDE
在类定义中,用于重载一个虚函数,例如在某个类中重载虛函数paintEvent(),可以定义如下:
void paintEvent(QPaintEvent*) Q_DECL_OVERRIDE;
使用Q_DECL_OVERRIDE宏后,如果重载的虚函数没有进行任何重载操作,编译器将会报错。
- Q_DECL_FINAL
这个宏将-一个虚函数定义为最终级别,不能再被重载,或定义一个类不能再被继承,示例如下:
class QRect Q_DECL_FINAL{ // QRect 不能再被继承
//...
};
- Q_UNUSED(name)
这个宏用于在函数中定义不在函数体里使用的参数,示例如下:
void MainWindow::on_imageSaved(int id, const QString &fileName)
{
Q_UNUSED(id) ;
LabInfo->setText ("图片保存为:"+fileName) ;
}
在这个函数里, id参数没有使用。如果不用Q_UNUSED(id) 定义,编译器会出现参数未使用的 警告。
- foreach(variable, container)
在C++11 中已经有标准库for循环直接替代此方法了
foreach用于容器类的遍历,例如:
foreach(const QString &codecName, recorder->supportedAudioCodecs())
ui -> comboCodec->addItem (codecName) ;
- forever
forever 用于构造-一个无限循环,例如:
forever{
...
}
它等同于:
for(;;){
...
}
- qDebug(const char *message, …)
在debugger 窗体显示信息,如果编译器设置了 QT_NO_DEBUG_OUTPUT ,则不作任何输出,例如:
qDebug("Items in list: %d", myList.size());
如果包含 <QtDebug> ,还可以使用更方便的语法:
qDebug() << "Brush:" << myQBrush << "Other value:" << i;
类似的宏还有qWarning、qCritical、 qFatal、 qInfo 等,也是用于在debugger 窗体显示信息。
呼,终于写的差不多了,看了下篇幅,也不少了,再写就有点冗余了,Qt的数据类型QtGlobal 类就介绍到这里,基本也就这些属于最常用的了,其他压根都很难用到,有兴趣的在以后的实战中自己去积累吧,吃多也消化不掉,能把我上面介绍的消化掉,基本上就够用了!