C++ | Qt 常用头文件及容器类
一、Qt常用头文件1.<QtGlobal> 头文件<QtGlobal> 头文件包含了 Qt 类库的一些全局定义,包括基本数据类型、函数和宏。一般的 Qt 类的头文件都会包含该文件,所以不用显式包含这个头文件也可以使用其中的定义。(1) Qt 中的数据类型定义Qt 数据类型等效定义字节数备注qint8signed char1qint16signed short2qint32.
目录
一、Qt常用头文件
1.<QtGlobal> 头文件
<QtGlobal> 头文件包含了 Qt 类库的一些全局定义,包括基本数据类型、函数和宏。一般的 Qt 类的头文件都会包含该文件,所以不用显式包含这个头文件也可以使用其中的定义。
(1) Qt 中的数据类型定义
Qt 数据类型 | 等效定义 | 字节数 | 备注 |
---|---|---|---|
qint8 | signed char | 1 | |
qint16 | signed short | 2 | |
qint32 | signed int | 4 | |
qint64 | long long int | 8 | |
qlonglong | long long int | 8 | |
quint8 | unsigned char | 1 | |
quint16 | unsigned short | 2 | |
quint32 | unsigned int | 4 | |
quint64 | unsigned long long int | 8 | |
qulonglong | unsigned long long int | 8 | |
uchar | unsigned char | 1 | |
ushort | unsigned short | 2 | |
uint | unsigned int | 4 | |
ulong | unsigned long | 8 | |
qreal | double | 8 | |
qfloat16 | 2 | Qt 5.9.0 中新增的一个类,用于表示 16 位的浮点数,使用时,需要包含头文件 <QFloat16>。 |
(2) 常用函数
若是以 double 或 float 类型数作为参数的,一般有两个参数版本的同名函数。(下面表格,若存在 double 和 float 两种参数版本,只列出 double 类型参数的版本)
函数 | 功能 |
---|---|
T qAbs(const T &value) | 返回变量 value 的绝对值 |
const T &qBound(const T &min, const T&value, const T &max) | 返回 value 限定在 min 至 max 范围之内的値 |
bool qFuzzyComparc(doublc p1, double p2) | 若 p1 和 p2 近似相等,返回 true |
bool qFuzzyIsNulI(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 |
constT&qMax(const T&value1, const T&value2) | 返回 value1 和 value2 中较大的值 |
const T &qMin(const T&value1, 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 对伪随机数字序列初始化 |
(3) 常用宏
1.QT_VERSION:这个宏展开为数值形式 0xMMNNPP (MM = major, NN = minor, PP = patch) 表示 Qt 编译器版本,例如 Qt 编译器版本为 Qt 5.9.1,则 QT_VERSION 为 0x050901。这个宏常用于条件编译设置,根据 Qt 版本不同,编译不同的代码段。
2.QT_VERSION_CHECK:这个宏展开为 Qt 版本号的一个整数表示
3.QT_VERSION_STR:这个宏展开为 Qt 版本号的字符串,如“5.9.0”
4.Q_BYTE_ORDER、Q_BIG_ENDIAN 和 Q_LITTLE_ENDIAN:Q_BYTE_ORDER 表示系统内存中数据的字节序,Q_BIG_ENDIAN 表示大端字节序,Q_LITTLE_ ENDIAN 表示小端字节序。在需要判断系统字节序时会用到
5.Q_DECL_IMPORT 和 Q_DECL_EXPORT:在使用或设计共享库时,用于导入或导出库的内容
6.Q_DECL_OVERRIDE:在类定义中,用于重载一个虚函数
7.Q_DECL_FINAL:这个宏将一个虚函数定义为最终级别,不能再被重载,或定义一个类不能再被继承
8.Q_UNUSED(name):用于在函数中定义不在函数体里使用的参数,如果不用 QJJNUSED 定义,编译器会出现参数未使用的警告。
9.foreach(variable, container):foreach 用于容器类的遍历
10.forever:forever用于构造一个无限循环
11.qDebug(const char * message,…):在debugger窗体显示信息,如果编译器设置了 Qt_NO_DEBUG_OUTPUT,则不作任何输出
void MainWindow::TestGlobalFun()
{
if(QT_VERSION>=QT_VERSION_CHECK(5,10,0))
{
qDebug("Version greater than 5.10.0");
}else{
qDebug("Version less than 5.10.0");
}
int num1=10,num2=20;
int num=qMin(num1,num2);
qDebug("num1 and num2,min is %d",num);//10
}
2.<QMath>头文件
函数 | 功能 |
---|---|
T qAbs(const T &value) | 返回变量 value 的绝对值 |
#include <QtMath>
#include <QDebug>
void MainWindow::TestMathFun()
{
double value=qSin(30*Pi/180);
qDebug("%f",value);//0.500000
double num= qLn(1)/qLn(2);//log2(1)=0
qDebug()<<num;//0
}
二、Qt容器类
Qt提供了多个基于模板的容器类,这些容器类可以用于存储指定类型的数据项。Qt 的容器类比标准模板库(STL)中的容器类更轻巧、安全和易于使用。这些容器类是隐式共享和可重入的,而且它们进行了速度和存储优化,因此可以减少可执行文件的大小。此外,它们还是线程安全的,也就是说它们作为只读容器时可被多个线程访问。
容器类是基于模板的类,如常用的容器类 QList<T>,T 是一个具体的类型,可以是 int、float 等简单类型,也可以是 Qstring、QDate 等类,但不能是 QObject 或任何其子类。T 必须是一个可赋值的类型,即T必须提供一个缺省的构造函数,一个可复制构造函数和一个赋值运算符。
Qt 的容器类分为顺序容器和关联容器。
1.顺序容器
Qt 的顺序容器类有 QList、QLinkedList、QVector、QStack 和 QQueue。
(1)QList
QList 是最常用的容器类,它以下标索引的方式对数据项进行访问。QList 用于添加、插入、替换、移动、删除数据项的函数有:insert()、replace()、removeAt()、move()、swap()、append()、prepend()、removeFirst() 和 removeLast() 等。
#include <QDebug>
void TestQList()
{
QList<int> _list;
_list<<1<<2;
_list.append(3);
_list.insert(0,0);
qDebug("_list size:%d",_list.size());//4
foreach(const int i , _list){
qDebug("%d",i);//0 1 2 3
//qDebug()<<i;
}
qDebug("%d",_list[2]);//2
_list.replace(2,10);
qDebug("%d",_list[2]);//10
qDebug()<<_list.at(2);//10
}
(2)QLinkedList
QLinkedList<T> 是链式列表,数据项不是用连续的内存存储的,它基于迭代器访问数据项,并且插入和删除数据项的操作时间相同。除了不提供基于下标索引的数据项访问外,QLinkedList 的其他接口函数与 QList 基本相同。
#include <QLinkedList>
#include <QDebug>
void TestQLinkedList()
{
QLinkedList<QString> _linked_list;
_linked_list<<"hello"<<"world";
_linked_list.append("HELLO");
_linked_list.insert(_linked_list.begin()+2,"WORLD");
qDebug("_linked_list size:%d",_linked_list.size());//4
for(QLinkedList<QString>::iterator iter=_linked_list.begin();iter!=_linked_list.end();iter++)
{
qDebug()<<*iter;//"hello"
//"world"
//"WORLD"
//"HELLO"
}
foreach(QString str,_linked_list)
{
qDebug()<<str;//"hello"
//"world"
//"WORLD"
//"HELLO"
}
}
(3)QVector
QVector<T> 提供动态数组的功能,以下标索引访问数据。QVector 的函数接口与 QList 几乎完全相同,QVector<T> 的性能比 QList<T> 更高,因为 QVector<P> 的数据项是连续存储的。
void TestQVector()
{
QVector<int> _vector;
_vector<<1<<2;
_vector.append(3);
_vector.insert(0,0);
qDebug("_list size:%d\n",_vector.size());//4
foreach(const int i , _vector){
qDebug("%d",i);//0 1 2 3
//qDebug()<<i;
}
qDebug("%d",_vector[2]);//2
_vector.replace(2,10);
qDebug("%d",_vector[2]);//10
}
(4)QStack
QStack<T> 是提供类似于堆栈的后入先出(LIFO)操作的容器类,push() 和 pop() 是主要的接口函数。
#include <QStack>
#include <QDebug>
void TestQStack()
{
QStack<int> stack;
stack.push(10);
stack.push(20);
stack.push(30);
while (!stack.isEmpty())
qDebug()<< stack.pop();//30 20 10
}
(5)QQueue
QQueue<T> 是提供类似于队列先入先出(FIFO)操作的容器类。enqueue() 和 dequeue() 是主要操作函数。
#include <QQueue>
#include <QDebug>
void TestQQueue()
{
QQueue<int> queue;
queue.enqueue(10);
queue.enqueue(20);
queue.enqueue(30);
while (!queue.isEmpty())
qDebug()<< queue.dequeue();//10 20 30
}
2.关联容器
Qt 还提供关联容器类 QMap、QMultiMap、QHash、QMultiHash 和 QSet。
(1)QMap
QMap<Key, T> 提供一个字典(关联数组),一个键映射到一个值。QMap 存储数据是按照键的顺序,如果不在乎存储顺序,使用 QHash 会更快。
如果在映射表中没有找到指定的键,会返回一个缺省构造值,例如,如果值的类型是字符串,会返回一个空的字符串。在使用 value() 函数查找键值时,还可以指定一个缺省的返回值。
#include <QDebug>
void TestQMap()
{
//QMap存储数据是按照键的顺序
QMap<int,char> _map;
for(int i=97;i<123;i++)
{
_map[i]=i;
}
foreach(char c,_map)
{
qDebug()<<c;//按顺序a b c...输出
}
qDebug()<<_map[100];//d
char upper_a=_map.value(65,'A');
qDebug()<<upper_a;//A
}
(2)QMultiMap
QMultiMap 是 QMap 的子类,是用于处理多值映射的便利类。多值映射就是一个键可以对应多个值。QMap 正常情况下不允许多值映射,除非使用 QMap::insertMulti() 添加键值对。
QMap 的大多数函数在 QMultiMap 都是可用的,但是有几个特殊的,QMultiMap::insert() 等效于 QMap::insertMulti() , QMultiMap::replace() 等效于 QMap::insert()。
#include <QDebug>
void TestQMultiMap()
{
QMultiMap<char,QString> _multiMap;
//QMultiMap 不提供“[]”操作符
//_multiMap['0']="ss";
_multiMap.insert('*',"pointer");
_multiMap.insert('*',"all");
_multiMap.insert('*',"multiplication sign");
qDebug()<<_multiMap.value('*');//最新的值 multiplication sign
QList<QString> _list=_multiMap.values('*');
foreach(QString str,_list)
{
qDebug()<<str;//"multiplication sign"
//"all"
//"pointer"
}
for(int i=0;i<_list.size();i++)
{
qDebug()<<_list[i];//"multiplication sign"
//"all"
//"pointer"
}
}
(3)QHash
QHash 是基于散列表来实现字典功能的模板类,QHash<Key,T> 存储的键值对具有非常快的查找速度。
QHash 与 QMap 的功能和用法相似,区别在于以下几点:
- QHash 比 QMap 的查找速度快;
- 在 QMap 上遍历时,数据项是按照键排序的,而 QHash 的数据项是任意顺序的;
- QMap 的键必须提供“<”运算符,QHash 的键必须提供“==”运算符和一个名称为 qHash() 的全局散列函数。
#include <QDebug>
void TestQHash()
{
QHash<int,char> _hash;
for(int i=97;i<123;i++)
{
_hash[i]=i;
}
foreach(char c,_hash)
{
qDebug()<<c;//不按顺序输出
}
qDebug()<<_hash[100];//d
char upper_a=_hash.value(65,'A');
qDebug()<<upper_a;//A
}
(4)QMultiHash
QMultiHash 是 QHash 的子类,是用于处理多值映射的便利类,其用法与 QMultiMap 类似。
#include <QDebug>
void TestQMultiHash()
{
QMultiHash<char,QString> _multiHash;
//_multiHash 不提供“[]”操作符
//_multiHash['0']="ss";
_multiHash.insert('*',"pointer");
_multiHash.insert('*',"all");
_multiHash.insert('*',"multiplication sign");
qDebug()<<_multiHash.value('*');//最新的值 multiplication sign
QList<QString> _list=_multiHash.values('*');
foreach(QString str,_list)
{
qDebug()<<str;//"multiplication sign"
//"all"
//"pointer"
}
for(int i=0;i<_list.size();i++)
{
qDebug()<<_list[i];//"multiplication sign"
//"all"
//"pointer"
}
}
(5)QSet
QSet 是基于散列表的集合模板类,它存储数据的顺序是不定的,查找值的速度非常快。 QSet<T> 内部就是用 QHash 实现的。
#include <QDebug>
void TestQSet()
{
QSet<QString> _set;
_set<<"abc"<<"ghi";
_set.insert("def");
foreach(QString str,_set)
{
qDebug()<<str;//每次输出顺序不确定
}
if(_set.contains("abc"))
{
qDebug("contains abc");
}else{
qDebug("not contains abc");
}
}
更多推荐
所有评论(0)