C++ | Qt 常用头文件及容器类

目录

一、Qt常用头文件

1. 头文件

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

(2) 常用函数

(3) 常用宏

2.头文件

二、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. 头文件

头文件包含了 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 位的浮点数,使用时,需要包含头文件

(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.头文件

函数 功能
   
T qAbs(const T &value) 返回变量 value 的绝对值
   
   
#include 
#include 

void MainWindow::TestMathFun()
{
    double value=qSin(30*Pi/180);
    qDebug("%f",value);//0.500000
    double num= qLn(1)/qLn(2);//log2(1)=0
    qDebug()<

二、Qt容器类

Qt提供了多个基于模板的容器类,这些容器类可以用于存储指定类型的数据项。Qt 的容器类比标准模板库(STL)中的容器类更轻巧、安全和易于使用。这些容器类是隐式共享和可重入的,而且它们进行了速度和存储优化,因此可以减少可执行文件的大小。此外,它们还是线程安全的,也就是说它们作为只读容器时可被多个线程访问。

容器类是基于模板的类,如常用的容器类 QList,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 

void TestQList()
{
    QList _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()<

(2)QLinkedList

QLinkedList 是链式列表,数据项不是用连续的内存存储的,它基于迭代器访问数据项,并且插入和删除数据项的操作时间相同。除了不提供基于下标索引的数据项访问外,QLinkedList 的其他接口函数与 QList 基本相同。

#include 
#include 

void TestQLinkedList()
{
    QLinkedList _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::iterator iter=_linked_list.begin();iter!=_linked_list.end();iter++)
   {
       qDebug()<<*iter;//"hello"
                       //"world"
                       //"WORLD"
                       //"HELLO"
   }
 
   foreach(QString str,_linked_list)
   {
       qDebug()<

(3)QVector

QVector 提供动态数组的功能,以下标索引访问数据。QVector 的函数接口与 QList 几乎完全相同,QVector 的性能比 QList 更高,因为 QVector

的数据项是连续存储的。


void TestQVector()
{
    QVector _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()<

(4)QStack

QStack 是提供类似于堆栈的后入先出(LIFO)操作的容器类,push() 和 pop() 是主要的接口函数。

#include 
#include 
void TestQStack()
{
    QStack stack;
    stack.push(10);
    stack.push(20);
    stack.push(30);
    while (!stack.isEmpty())
       qDebug()<< stack.pop();//30 20 10
}

(5)QQueue

QQueue 是提供类似于队列先入先出(FIFO)操作的容器类。enqueue() 和 dequeue() 是主要操作函数。

#include 
#include 
void TestQQueue()
{
    QQueue 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 提供一个字典(关联数组),一个键映射到一个值。QMap 存储数据是按照键的顺序,如果不在乎存储顺序,使用 QHash 会更快。

如果在映射表中没有找到指定的键,会返回一个缺省构造值,例如,如果值的类型是字符串,会返回一个空的字符串。在使用 value() 函数查找键值时,还可以指定一个缺省的返回值。

#include 
void TestQMap()
{
    //QMap存储数据是按照键的顺序
    QMap _map;
    for(int i=97;i<123;i++)
    {
        _map[i]=i;
    }
    foreach(char c,_map)
    {
         qDebug()<

(2)QMultiMap

QMultiMap 是 QMap 的子类,是用于处理多值映射的便利类。多值映射就是一个键可以对应多个值。QMap 正常情况下不允许多值映射,除非使用 QMap::insertMulti() 添加键值对。

QMap 的大多数函数在 QMultiMap 都是可用的,但是有几个特殊的,QMultiMap::insert() 等效于 QMap::insertMulti() , QMultiMap::replace() 等效于 QMap::insert()。

#include 
void TestQMultiMap()
{
    QMultiMap _multiMap;
    //QMultiMap 不提供“[]”操作符
    //_multiMap['0']="ss";
    _multiMap.insert('*',"pointer");
    _multiMap.insert('*',"all");
    _multiMap.insert('*',"multiplication sign");
    qDebug()<<_multiMap.value('*');//最新的值 multiplication sign
    QList _list=_multiMap.values('*');
    foreach(QString str,_list)
    {
        qDebug()<

(3)QHash

QHash 是基于散列表来实现字典功能的模板类,QHash 存储的键值对具有非常快的查找速度。

QHash 与 QMap 的功能和用法相似,区别在于以下几点:

  1. QHash 比 QMap 的查找速度快;
  2. 在 QMap 上遍历时,数据项是按照键排序的,而 QHash 的数据项是任意顺序的;
  3. QMap 的键必须提供“<”运算符,QHash 的键必须提供“==”运算符和一个名称为 qHash() 的全局散列函数。
#include 
void TestQHash()
{
    QHash _hash;
    for(int i=97;i<123;i++)
    {
        _hash[i]=i;
    }
    foreach(char c,_hash)
    {
        qDebug()<

(4)QMultiHash

QMultiHash 是 QHash 的子类,是用于处理多值映射的便利类,其用法与 QMultiMap 类似。

#include 
void TestQMultiHash()
{
    QMultiHash _multiHash;
    //_multiHash 不提供“[]”操作符
    //_multiHash['0']="ss";
    _multiHash.insert('*',"pointer");
    _multiHash.insert('*',"all");
    _multiHash.insert('*',"multiplication sign");
    qDebug()<<_multiHash.value('*');//最新的值 multiplication sign
    QList _list=_multiHash.values('*');
    foreach(QString str,_list)
    {
        qDebug()<

(5)QSet

QSet 是基于散列表的集合模板类,它存储数据的顺序是不定的,查找值的速度非常快。 QSet 内部就是用 QHash 实现的。

#include 
void TestQSet()
{
    QSet _set;
    _set<<"abc"<<"ghi";
    _set.insert("def");
    foreach(QString str,_set)
    {
        qDebug()<

 

 

 

 

 

 

你可能感兴趣的:(C++,Qt,c++,qt)