目录

一、Qt常用头文件

1. <QtGlobal>头文件

(1) Qt 中的数据类型定义

(2) 常用函数

(3) 常用宏

2.<QMath>头文件

二、Qt容器类

1.顺序容器

(1)QList

(2)QLinkedList

(3)QVector

(4)QStack

(5)QQueue

2.关联容器

(1)QMap

(2)QMultiMap

(3)QHash

(4)QMultiHash

(5)QSet


一、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 的功能和用法相似,区别在于以下几点:

  1. QHash 比 QMap 的查找速度快;
  2. 在 QMap 上遍历时,数据项是按照键排序的,而 QHash 的数据项是任意顺序的;
  3. 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");
    }
}

 

 

 

 

 

 

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐