Qt——常用数据类型

Qt——常用数据类型

1.基础类型

因为Qt是一个C++框架,因此C++中所有的语法和数据类型在Qt中都是被支持的,但是Qt中也定义了一些属于自己的数据类型,下边给大家介绍一下这些基础的数类型。

QT基本数据类型定义在#include<QtGlobal>中,QT基本数据类型有:

类型名称

注释

备注

qint8

signedchar

有符号8位数据

qint16

signedshort

16位数据类型

qint32

signedshort

32位有符号数据类型

qint64

longlongint或(int64)

64位有符号数据类型,Windows中定义为int64

qintptr

qint32或qint64

指针类型根据系统类型不同而不同,32位系统为qint32、64位系统为qint64

qlonglong

longlongint或(int64)

Windows中定义为int64

qptrdiff

qint32或qint64

根据系统类型不同而不同,32位系统为qint32、64位系统为qint64

qreal

double或float

除非配置了-qrealfloat选项,否则默认为double

quint8

unsignedchar

无符号8位数据类型

quint16

unsignedshort

无符号16位数据类型

quint32

unsignedint

无符号32位数据类型

quint64

unsignedlonglongint或(unsignedint64)

无符号64比特数据类型,Windows中定义为unsignedint64

quintptr

quint32或quint64

根据系统类型不同而不同,32位系统为quint32、64位系统为quint64

qulonglong

unsignedlonglongint或(unsignedint64)

Windows中定义为int64

uchar

unsignedchar

无符号字符类型

uint

unsignedint

无符号整型

ulong

unsignedlong

无符号长整型

ushort

unsignedshort

无符号短整型

qsizetype

size_t

2.log输出

在Qt中进行log输出,一般不使用c中的printf,也不是使用C++中的cout,Qt框架提供了专门用于日志输出的类,头文件名为QDebug。

【领更多QT学习资料,点击下方链接免费领取↓↓,先码住不迷路

点击→领Qt开发必备技术栈学习路线+资料

基本分类

qDebug:调试信息提示qInfo:输出信息qWarning:一般的警告提示qCritical:严重的错误提示qFatal:致命错误提示,会直接中断程序

C风格输出

qDebug(“我是%s,今年%d岁了”,“maye”,20);qInfo(“maye%d”,666);qWarning(“hello%s”,“warning”);qCritical(“helo%s”,“critical”);qFatal(“hello%s”,“qFatal”);//致命错误会直接中断程序

C++风格

qDebug()<<“好帅”<<endl;qInfo()<<“qInfo”<<endl;qWarning()<<“qWarnning”<<endl;qCritical()<<“qCritical”<<endl;#qFatal()<<“qFatal”<<endl;//致命错误不能用<<输出3.字符串类型

C=>char*

C++=>std::string

Qt=>QByteArray,QString

3.1QByteArray

在Qt中QByteArray可以看做是C语言中char*的升级版本。我们在使用这种类型的时候可通过这个类的构造函数申请一块动态内存,用于存储我们需要处理的字符串数据。

下面给大家介绍一下这个类中常用的一些API函数,大家要养成遇到问题主动查询帮助文档的好习惯

构造函数

//构造空对象,里边没有数据QByteArray::QByteArray();//将data中的size个字符进行构造,得到一个字节数组对象//如果size==-1函数内部自动计算字符串长度,计算方式为:strlen(data)QByteArray::QByteArray(constchar*data,intsize=-1);//构造一个长度为size个字节,并且每个字节值都为ch的字节数组QByteArray::QByteArray(intsize,charch);

数据操作

//其他重载的同名函数可参考Qt帮助文档,此处略QByteArray&QByteArray::append(constQByteArray&ba);voidQByteArray::push_back(constQByteArray&other);//其他重载的同名函数可参考Qt帮助文档,此处略QByteArray&QByteArray::prepend(constQByteArray&ba);voidQByteArray::push_front(constQByteArray&other);?//插入数据,将ba插入到数组第i个字节的位置(从0开始)//其他重载的同名函数可参考Qt帮助文档,此处略QByteArray&QByteArray::insert(inti,constQByteArray&ba);?//删除数据//从大字符串中删除len个字符,从第pos个字符的位置开始删除QByteArray&QByteArray::remove(intpos,intlen);//从字符数组的尾部删除n个字节voidQByteArray::chop(intn);//从字节数组的pos位置将数组截断(前边部分留下,后边部分被删除)voidQByteArray::truncate(intpos);//将对象中的数据清空,使其为nullvoidQByteArray::clear();?//字符串替换//将字节数组中的子字符串before替换为after//其他重载的同名函数可参考Qt帮助文档,此处略QByteArray&QByteArray::replace(constQByteArray&before,constQByteArray&after);

子字符串查找和判断

//判断字节数组中是否包含子字符串ba,包含返回true,否则返回falseboolQByteArray::contains(constQByteArray&ba)const;boolQByteArray::contains(constchar*ba)const;//判断字节数组中是否包含子字符ch,包含返回true,否则返回falseboolQByteArray::contains(charch)const;?//判断字节数组是否以字符串ba开始,是返回true,不是返回falseboolQByteArray::startsWith(constQByteArray&ba)const;boolQByteArray::startsWith(constchar*ba)const;//判断字节数组是否以字符ch开始,是返回true,不是返回falseboolQByteArray::startsWith(charch)const;?//判断字节数组是否以字符串ba结尾,是返回true,不是返回falseboolQByteArray::endsWith(constQByteArray&ba)const;boolQByteArray::endsWith(constchar*ba)const;//判断字节数组是否以字符ch结尾,是返回true,不是返回falseboolQByteArray::endsWith(charch)const;

遍历

//使用迭代器iteratorQByteArray::begin();iteratorQByteArray::end();?//使用数组的方式进行遍历//i的取值范围0<=i<size()charQByteArray::at(inti)const;charQByteArray::operatorconst;?

查看字节数

//返回字节数组对象中字符的个数intQByteArray::length()const;intQByteArray::size()const;intQByteArray::count()const;?//返回字节数组对象中子字符串ba出现的次数intQByteArray::count(constQByteArray&ba)const;intQByteArray::count(constchar*ba)const;//返回字节数组对象中字符串ch出现的次数intQByteArray::count(charch)const;

类型转换

//将QByteArray类型的字符串转换为char*类型char*QByteArray::data();constchar*QByteArray::data()const;?//int,short,long,float,double->QByteArray//其他重载的同名函数可参考Qt帮助文档,此处略QByteArray&QByteArray::setNum(intn,intbase=10);QByteArray&QByteArray::setNum(shortn,intbase=10);QByteArray&QByteArray::setNum(qlonglongn,intbase=10);QByteArray&QByteArray::setNum(floatn,charf=‘g’,intprec=6);QByteArray&QByteArray::setNum(doublen,charf=‘g’,intprec=6);[static]QByteArrayQByteArray::number(intn,intbase=10);[static]QByteArrayQByteArray::number(qlonglongn,intbase=10);[static]QByteArrayQByteArray::number(doublen,charf=‘g’,intprec=6);?//QByteArray->int,short,long,float,doubleintQByteArray::toInt(bool*ok=Q_NULLPTR,intbase=10)const;shortQByteArray::toShort(bool*ok=Q_NULLPTR,intbase=10)const;longQByteArray::toLong(bool*ok=Q_NULLPTR,intbase=10)const;floatQByteArray::toFloat(bool*ok=Q_NULLPTR)const;doubleQByteArray::toDouble(bool*ok=Q_NULLPTR)const;?//std::string->QByteArray[static]QByteArrayQByteArray::fromStdString(conststd::string&str);//QByteArray->std::stringstd::stringQByteArray::toStdString()const;?//所有字符转换为大写QByteArrayQByteArray::toUpper()const;//所有字符转换为小写QByteArrayQByteArray::toLower()const;3.2QString

QString也是封装了字符串,但是内部的编码为utf8,UTF-8属于Unicode字符集,它固定使用多个字节(window为2字节,linux为3字节)来表示一个字符,这样可以将世界上几乎所有语言的常用字符收录其中。

下面给大家介绍一下这个类中常用的一些API函数。

构造函数

//构造一个空字符串对象QString();//将char*字符串转换为QString类型QString(constchar*str);//将QByteArray转换为QString类型QString(constQByteArray&ba);//其他重载的同名构造函数可参考Qt帮助文档,此处略数据操作

//尾部追加数据QString&append(constQString&str);QString&append(constchar*str);QString&append(constQByteArray&ba);voidpush_back(constQString&other);?//头部添加数据QString&prepend(constQString&str);QString&prepend(constchar*str);QString&prepend(constQByteArray&ba);voidQString::push_front(constQString&other);?//插入数据,将str插入到字符串第position个字符的位置(从0开始)QString&insert(intposition,constQString&str);QString&insert(intposition,constchar*str);QString&insert(intposition,constQByteArray&str);?//删除数据//从大字符串中删除len个字符,从第pos个字符的位置开始删除QString&remove(intposition,intn);?//从字符串的尾部删除n个字符voidchop(intn);//从字节串的position位置将字符串截断(前边部分留下,后边部分被删除)voidtruncate(intposition);//将对象中的数据清空,使其为nullvoidclear();?//字符串替换//将字节数组中的子字符串before替换为after//参数cs为是否区分大小写,默认区分大小写QString&replace(constQString&before,constQString&after,Qt::CaseSensitivitycs=Qt::CaseSensitive);子字符串查找和判断

//参数cs为是否区分大小写,默认区分大小写//其他重载的同名函数可参考Qt帮助文档,此处略?//判断字符串中是否包含子字符串str,包含返回true,否则返回falseboolcontains(constQString&str,Qt::CaseSensitivitycs=Qt::CaseSensitive)const;?//判断字符串是否以字符串ba开始,是返回true,不是返回falseboolstartsWith(constQString&s,Qt::CaseSensitivitycs=Qt::CaseSensitive)const;?//判断字符串是否以字符串ba结尾,是返回true,不是返回falseboolendsWith(constQString&s,Qt::CaseSensitivitycs=Qt::CaseSensitive)const;遍历

//使用迭代器iteratorbegin();iteratorend();?//使用数组的方式进行遍历constQCharat(intposition)constconstQCharoperatorconst;查看字节数

//返回字节数组对象中字符的个数intlength()const;intsize()const;intcount()const;?//返回字节串对象中子字符串str出现的次数//参数cs为是否区分大小写,默认区分大小写intcount(constQStringRef&str,Qt::CaseSensitivitycs=Qt::CaseSensitive)const;类型转换

//int,short,long,float,double->QString//其他重载的同名函数可参考Qt帮助文档,此处略QString&setNum(intn,intbase=10);QString&setNum(shortn,intbase=10);QString&setNum(longn,intbase=10);QString&setNum(floatn,charformat=‘g’,intprecision=6);QString&QString::setNum(doublen,charformat=‘g’,intprecision=6);[static]QStringQString::number(longn,intbase=10);[static]QStringQString::number(intn,intbase=10);[static]QStringQString::number(doublen,charformat=‘g’,intprecision=6);?//QString->int,short,long,float,doubleintQString::toInt(bool*ok=Q_NULLPTR,intbase=10)const;shortQString::toShort(bool*ok=Q_NULLPTR,intbase=10)const;longQString::toLong(bool*ok=Q_NULLPTR,intbase=10)constfloatQString::toFloat(bool*ok=Q_NULLPTR)const;doubleQString::toDouble(bool*ok=Q_NULLPTR)const;??//所有字符转换为大写QStringQString::toUpper()const;//所有字符转换为小写QStringQString::toLower()const;字符串格式化

C语言中有sprintf()函数,QString也提供了一个asprintf()函数。

QStringres=QString::asprintf(“fileName:%ssize:%d”,“./av.jpg”,20);qDebug()<<res<<endl;

不过QString还提供的另一种格式化字符串输出的函数arg(),更为方便。

QStringarg(constQString&a,intfieldWidth=0,QCharfillChar=QLatin1Char(‘’))const;QStringarg(inta,intfieldWidth=0,intbase=10,QCharfillChar=QLatin1Char(‘’))const;//用于填充字符串中的%1,%2…为给定格式的整形数字,其中第一个参数是要填充的数字,第二个参数为最小宽度,第三个参数为进制,第四个参数为当原始数字长度不足最小宽度时用于填充的字符?//示例程序QStringstr=QString(“%1%2%3”).arg(1).arg(2);str=str.arg(“hello”);qDebug()<<str<<endl;//“hello21”?QStringtext=QString(“%1:%2:%3”).arg(1,2,10,QChar(‘0’)).arg(35).arg(59);qDebug()<<text<<endl;//“01:35:59”

【领更多QT学习资料,点击下方链接免费领取↓↓,先码住不迷路

点击→领Qt开发必备技术栈学习路线+资料

3.2不同字符串类型相互转换

//std::string->QString[static]QStringQString::fromStdString(conststd::string&str);//QString->std::stringstd::stringQString::toStdString()const;?#QString->QByteArray//转换为本地编码,跟随操作系统QByteArrayQString::toLocal8Bit()const;//转换为Latin-1编码的字符串不支持中文QByteArrayQString::toLatin1()const;//转换为utf8编码格式的字符串(常用)QByteArrayQString::toUtf8()const;?#QByteArray->QString//使用QString的构造函数即可4.QVariant

QVariant(变体数据类型)这个类很神奇,或者说方便。很多时候,需要几种不同的数据类型需要传递,如果用结构体,又不大方便,容器保存的也只是一种数据类型,而QVariant则可以统统搞定。

QVariant这个类型充当着最常见的数据类型的联合。QVariant可以保存很多Qt的数据类型,包括QBrush、QColor、QCursor、QDateTime、QFont、QKeySequence、QPalette、QPen、QPixmap、QPoint、QRect、QRegion、QSize和QString,并且还有C++基本类型,如int、float等。

4.1标准类型将标准类型转换为QVariant类型

//这类转换需要使用QVariant类的构造函数,由于比较多,大家可自行查阅Qt帮助文档,在这里简单写几个QVariant(intval);QVariant(boolval);QVariant(doubleval);QVariant(constchar*val);QVariant(constQByteArray&val);QVariant(constQString&val);……//使用设置函数也可以将支持的类型的数据设置到QVariant对象中//这里的T类型,就是QVariant支持的类型voidsetValue(constT&value);//该函数行为和setValue()函数完全相同[static]QVariantfromValue(constT&value);

Exmple

QVariantv(5);?QVariantv;v.setValue(5);?QVariantv=QVariant::fromValue(5);?inti=v.toInt();//iisnow5QStrings=v.toString();//sisnow“5”判断QVariant中封装的实际数据类型

Type是枚举类型

//获取类型,返回的是一个枚举类型;如QVariant::Int…Typetype()const;//获取类型名constchar*typeName()const;//根据类型id(枚举)获取类型名(字符串)[static]constchar*typeToName(inttypeId);//根据类型名(字符串)获取类型id(枚举)[static]TypenameToType(constchar*name);将QVariant对象转换为实际的数据类型

//在转换之前可以先判断能够转换成对应的类型boolcanConvert(inttargetTypeId)constboolcanConvert()constbooltoBool()const;QByteArraytoByteArray()const;doubletoDouble(bool*ok=Q_NULLPTR)const;floattoFloat(bool*ok=Q_NULLPTR)const;inttoInt(boolok=Q_NULLPTR)const;QStringtoString()const;……?Tvalue()const//v.value<int>();4.2自定义类型

除了标准类型,我们自定义的类型也可以使用QVariant类进行封装,被QVariant存储的数据类型需要有一个默认的构造函数和一个拷贝构造函数。为了实现这个功能,首先必须使用Q_DECLARE_METATYPE()宏。通常会将这个宏放在类的声明所在头文件的下面,原型为:

Q_DECLARE_METATYPE(Type)

使用的具体步骤如下:

第一步:定义类型,并注册

//自定义类型classAnimal{public:Animal(){}//必须要有默认构造函数//拷贝构造函数也必须有,不过没有深、浅拷贝时,用默认的即可Animal(QStringname):_name(name){}voidshow(){qDebug()<<“Animalshownameis:”<<_name<<endl;}private:QString_name;};//自定义类型注册Q_DECLARE_METATYPE(Animal);第二步:使用forvalue()存储对象

intmain(){//QVariantvt(Animal(“snake”));//不可以通过构造函数存自定义类型QVariantvt;//有以下两种方法可以,存自定义类型vt=QVariant::fromValue(Animal(“dog”));//①vt.setValue(Animal(“cat”));//②//如果能转换到Animal类型,就转换if(vt.canConvert<Animal>()){Animalanimal=vt.value<Animal>();animal.show();}return0;}

操作涉及的API如下:

//如果当前QVariant对象可用转换为对应的模板类型T,返回true,否则返回falseboolcanConvert()const;//将当前QVariant对象转换为实际的T类型Tvalue()const;5.位置和尺寸

在QT中我们常见的点,线,尺寸,矩形都被进行了封装,下边依次为大家介绍相关的类。

5.1QPoint

QPoint类封装了我们常用用到的坐标点(x,y),常用的API如下:

voidQPoint::setX(intx);voidQPoint::setY(inty);?intQPoint::x()const;int&QPoint::rx();?intQPoint::y()const;int&QPoint::ry();?//如果x和y坐标都为0则返回true,否则返回falseboolisNull()const//返回x()和y()的绝对值之和,传统上称为从原点到该点的向量的“曼哈顿长度”。//(p1-p2).manhattanLength();intmanhattanLength()const//返回一个交换了x和y坐标的点:QPoint{1,2}.transposed()//{2,1}QPointtransposed()const//直接通过坐标对象进行算术运算:加减乘除QPoint&QPoint::operator=(floatfactor);QPoint&QPoint::operator=(doublefactor);QPoint&QPoint::operator=(intfactor);QPoint&QPoint::operator+=(constQPoint&point);QPoint&QPoint::operator-=(constQPoint&point);QPoint&QPoint::operator/=(qrealdivisor);…5.2QLine

QLine是一个直线类,封装了两个坐标点(两点确定一条直线)

常用API如下:

//设置直线的起点坐标voidsetP1(constQPoint&p1);//设置直线的终点坐标voidsetP2(constQPoint&p2);?voidsetPoints(constQPoint&p1,constQPoint&p2);voidsetLine(intx1,inty1,intx2,inty2);??QPointp1()const;//返回直线的起始点坐标QPointp2()const;//返回直线的终点坐标QPointcenter()const;//返回值直线的中心点坐标,(p1()+p2())/2??intx1()const;//返回值直线起点的x坐标inty1()const;//返回值直线起点的y坐标intx2()const;//返回值直线终点的x坐标inty2()const;//返回值直线终点的y坐标?intdx()const//返回直线向量的水平分量intdy()const//返回直线向量的垂直分量//用给定的坐标点平移这条直线voidtranslate(constQPoint&offset);voidtranslate(intdx,intdy);//用给定的坐标点平移这条直线,返回平移之后的坐标点(不会改变这条线的坐标)QLinetranslated(constQPoint&offset)const;QLinetranslated(intdx,intdy)const;?//直线对象进行比较booloperator!=(constQLine&line)const;booloperator==(constQLine&line)const;5.3QSize

在QT中QSize类用来形容长度和宽度,常用的API如下:

voidsetWidth(intwidth)voidsetHeight(intheight);?intwidth()const;//得到宽度int&rwidth();//得到宽度的引用intheight()const;//得到高度int&rheight();//得到高度的引用?voidtranspose();//交换高度和宽度的值QSizetransposed()const;//交换高度和宽度的值,返回交换之后的尺寸信息?//返回一个大小,宽为当前大小与other的最小值,高为当前大小与other的最小值QSizeboundedTo(constQSize&oterSize)//返回一个大小,宽为当前大小与other的最大值,高为当前大小与other的最大值QSizeexpandedTo(constQSize&otherSize)const/根据指定的模式,按给定的宽度和高度缩放矩形:如果mode为Qt::IgnoreAspectRatio,则大小设置为(width,height)。如果mode为Qt::KeepAspectRatio,当前大小将在内部缩放到一个尽可能大的矩形(宽度,高度),保持高宽比。如果mode是Qt::KeepAspectRatioByExpanding,当前大小被缩放到一个矩形,尽可能小的外部(宽度,高度),保持长宽比。/voidscale(intwidth,intheight,Qt::AspectRatioModemode)voidscale(constQSize&size,Qt::AspectRatioModemode)QSizescaled(intwidth,intheight,Qt::AspectRatioModemode)constQSizescaled(constQSize&s,Qt::AspectRatioModemode)const//进行算法运算:加减乘除QSize&operator*=(qrealfactor);QSize&operator+=(constQSize&size);QSize&operator-=(constQSize&size);QSize&operator/=(qrealdivisor);5.4QRect

在Qt中使用QRect类来描述一个矩形,常用的API如下:

//构造一个空对象QRect::QRect();//基于左上角坐标,和右下角坐标构造一个矩形对象QRect::QRect(constQPoint&topLeft,constQPoint&bottomRight);//基于左上角坐标,和宽度,高度构造一个矩形对象QRect::QRect(constQPoint&topLeft,constQSize&size);//通过左上角坐标(x,y),和矩形尺寸(width,height)构造一个矩形对象QRect::QRect(intx,inty,intwidth,intheight);?//设置矩形的尺寸信息,左上角坐标不变voidQRect::setSize(constQSize&size);//设置矩形左上角坐标为(x,y),大小为(width,height)voidQRect::setRect(intx,inty,intwidth,intheight);//设置矩形宽度voidQRect::setWidth(intwidth);//设置矩形高度voidQRect::setHeight(intheight);?//返回值矩形左上角坐标QPointQRect::topLeft()const;//返回矩形右上角坐标//该坐标点值为:QPoint(left()+width()-1,top())QPointQRect::topRight()const;//返回矩形左下角坐标//该坐标点值为:QPoint(left(),top()+height()-1)QPointQRect::bottomLeft()const;//返回矩形右下角坐标//该坐标点值为:QPoint(left()+width()-1,top()+height()-1)QPointQRect::bottomRight()const;//返回矩形中心点坐标QPointQRect::center()const;?//返回矩形上边缘y轴坐标intQRect::top()const;intQRect::y()const;//返回值矩形下边缘y轴坐标intQRect::bottom()const;//返回矩形左边缘x轴坐标intQRect::x()const;intQRect::left()const;//返回矩形右边缘x轴坐标intQRect::right()const;?//返回矩形的高度intQRect::width()const;//返回矩形的宽度intQRect::height()const;//返回矩形的尺寸信息QSizeQRect::size()const;?//调整矩形的尺寸(左上角和右下角坐标偏移量)voidQRect::adjust(intdx1,intdy1,intdx2,intdy2)QRectQRect::adjusted(intdx1,intdy1,intdx2,intdy2)const

QPoint,QLine,QSize,QRect各自都还有浮点型版本的,分别是QPointF,QLineF,QSizeF,QRectF,函数基本一样

6.日期和时间6.1.QDate

//构造函数QDate::QDate();QDate::QDate(inty,intm,intd);?//公共成员函数//重新设置日期对象中的日期boolQDate::setDate(intyear,intmonth,intday);//给日期对象添加ndays天QDateQDate::addDays(qint64ndays)const;//给日期对象添加nmonths月QDateQDate::addMonths(intnmonths)const;//给日期对象添加nyears月QDateQDate::addYears(intnyears)const;?//得到日期对象中的年/月/日intQDate::year()const;intQDate::month()const;intQDate::day()const;voidQDate::getDate(int*year,int*month,int*day)const;/日期对象格式化d-没有前导零的日子(1to31)dd-前导为0的日子(01to31)ddd-显示(缩写)周一、周二、周三、周四、周五、周六、周日dddd-显示(完整)星期一、星期二、星期三、星期四、星期五、星期六、星期日M-没有前导零的月份(1到12)MM-前导零的月份(01到12)MMM-缩写1月、2月、3月…MMMM-完整一月、二月、三月…yy-两个数字的年(00to99)yyyy-以四位数表示的年份/QStringQDate::toString(constQString&format)const;?//操作符重载==>日期比较boolQDate::operator!=(constQDate&d)const;boolQDate::operator<(constQDate&d)const;boolQDate::operator<=(constQDate&d)const;boolQDate::operator==(constQDate&d)const;boolQDate::operator>(constQDate&d)const;boolQDate::operator>=(constQDate&d)const;?//静态函数->得到本地的当前日期[static]QDateQDate::currentDate();6.2.QTime

【领更多QT学习资料,点击下方链接免费领取↓↓,先码住不迷路

点击→领Qt开发必备技术栈学习路线+资料

//构造函数QTime::QTime();/h==>mustbeintherange0to23mands==>mustbeintherange0to59ms==>mustbeintherange0to999/QTime::QTime(inth,intm,ints=0,intms=0);?//公共成员函数//Returnstrueifthesettimeisvalid;otherwisereturnsfalse.boolQTime::setHMS(inth,intm,ints,intms=0);QTimeQTime::addSecs(ints)const;QTimeQTime::addMSecs(intms)const;?//示例代码QTimen(14,0,0);//n==14:00:00QTimet;t=n.addSecs(70);//t==14:01:10t=n.addSecs(-70);//t==13:58:50t=n.addSecs(10*60*60+5);//t==00:00:05t=n.addSecs(-15*6060);//t==23:00:00?//从时间对象中取出时/分/秒/毫秒//Returnsthehourpart(0to23)ofthetime.Returns-1ifthetimeisinvalid.intQTime::hour()const;//Returnstheminutepart(0to59)ofthetime.Returns-1ifthetimeisinvalid.intQTime::minute()const;//Returnsthesecondpart(0to59)ofthetime.Returns-1ifthetimeisinvalid.intQTime::second()const;//Returnsthemillisecondpart(0to999)ofthetime.Returns-1ifthetimeisinvalid.intQTime::msec()const;??//时间格式化/–时h==>Thehourwithoutaleadingzero(0to23or1to12ifAM/PMdisplay)hh==>Thehourwithaleadingzero(00to23or01to12ifAM/PMdisplay)H==>Thehourwithoutaleadingzero(0to23,evenwithAM/PMdisplay)HH==>Thehourwithaleadingzero(00to23,evenwithAM/PMdisplay)–分m==>Theminutewithoutaleadingzero(0to59)mm==>Theminutewithaleadingzero(00to59)–秒s==>Thewholesecond,withoutanyleadingzero(0to59)ss==>Thewholesecond,withaleadingzerowhereapplicable(00to59)–毫秒zzz==>Thefractionalpartofthesecond,tomillisecondprecision,includingtrailingzeroeswhereapplicable(000to999).–上午或者下午APorA==>使用AM/PM(大写)描述上下午,中文系统显示汉字apora==>使用am/pm(小写)描述上下午,中文系统显示汉字*/QStringQTime::toString(constQString&format)const;??//操作符重载==>时间比较boolQTime::operator!=(constQTime&t)const;boolQTime::operator<(constQTime&t)const;boolQTime::operator<=(constQTime&t)const;boolQTime::operator==(constQTime&t)const;boolQTime::operator>(constQTime&t)const;boolQTime::operator>=(constQTime&t)const;?//静态函数->得到当前时间[static]QTimeQTime::currentTime();经时计时器

QTime的经时计时器已经过时了,推荐使用QElapsedTimer。

//QTime已废弃的函数//开始计时voidQTime::start();//计时结束intQTime::elapsed()const;//重新计时intQTime::restart();?//推荐使用的API函数//QElapsedTimer类voidQElapsedTimer::start();qint64QElapsedTimer::restart();qint64QElapsedTimer::elapsed()const;主要的使用方法就是测量一个操作耗时多久,例子如下:QElapsedTimerelapse;elapse.start();?for(inti=0;i<10000000;i++);?qDebug()<<elapse.elapsed()<<endl;6.3.QDateTime

//构造函数QDateTime::QDateTime();QDateTime::QDateTime(constQDate&date,constQTime&time,Qt::TimeSpecspec=Qt::LocalTime);?//公共成员函数//设置日期voidQDateTime::setDate(constQDate&date);//设置时间voidQDateTime::setTime(constQTime&time);//给当前日期对象追加年/月/日/秒/毫秒,参数可以是负数QDateTimeQDateTime::addYears(intnyears)const;QDateTimeQDateTime::addMonths(intnmonths)const;QDateTimeQDateTime::addDays(qint64ndays)const;QDateTimeQDateTime::addSecs(qint64s)const;QDateTimeQDateTime::addMSecs(qint64msecs)const;?//得到对象中的日期QDateQDateTime::date()const;//得到对象中的时间QTimeQDateTime::time()const;?//日期和时间格式,格式字符参考QDate和QTime类的toString()函数QStringQDateTime::toString(constQString&format)const;??//操作符重载==>日期时间对象的比较boolQDateTime::operator!=(constQDateTime&other)const;boolQDateTime::operator<(constQDateTime&other)const;boolQDateTime::operator<=(constQDateTime&other)const;boolQDateTime::operator==(constQDateTime&other)const;boolQDateTime::operator>(constQDateTime&other)const;boolQDateTime::operator>=(constQDateTime&other)const;?//静态函数//得到当前时区的日期和时间(本地设置的时区对应的日期和时间)[static]QDateTimeQDateTime::currentDateTime();7.容器

Qt中提供了一组通用的基于模板的容器类(containerclass)。可以用来存储指定的项(items),与STL(C++标准模板库)相比,Qt中的容器更轻量,更安全,功能更强大。

序列式容器QListQLinkedListQVectorQStackQQueue对于大多数应用程序,QList是最好的类型。虽然它是作为数组列表实现的,但是它提供了非常快的前置和附加。如果你真的需要一个链表,使用QLinkedList;如果您希望您的项目占用连续的内存位置,请使用QVector。QStack和QQueue是提供LIFO和FIFO语义的便利类。关联式容器QMapQMultiMapQHashQMultiHashQSet“multi”容器方便地支持与单个键相关联的多个值。“hash”容器通过使用哈希函数而不是对排序集进行二进制搜索,从而提供更快的查找。作为特殊情况,QCache和QContiguousCache类在有限的缓存存储中提供了对象的高效散列查找。遍历容器:iterator

Qt提供了两种遍历容器的风格:

java风格的迭代器和stl风格的迭代器。java风格的迭代器更容易使用并提供高级功能,而STL风格的迭代器稍微更高效,可以与Qt和STL的通用算法一起使用。

java风格

容器

只读迭代器

读写迭代器

QList<T>,QQueue<T>

QListIterator<T>

QMutableListIterator<T>

QLinkedList<T>

QLinkedListIterator<T>

QMutableLinkedListIterator<T>

QVector<T>,QStack<T>

QVectorIterator<T>

QMutableVectorIterator<T>

QSet<T>

QSetIterator<T>

QMutableSetIterator<T>

QMap<Key,T>,QMultiMap<Key,T>

QMapIterator<T>

QMutableMapIterator<T>

QHash<Key,T>,QMultiHash<Key,T>

QHashIterator<T>

QMutableHashIterator<T>

STL风格

容器

只读迭代器

读写迭代器

QList<T>,QQueue<T>

QList<T>::const_iterator

QList<T>::iterator

QLinkedList<T>

QLinkedList<T>::const_iterator

QLinkedList<T>::iterator

QVector<T>,QStack<T>

QVector<T>::const_iterator

QVector<T>::iterator

QSet<T>

QSet<T>::const_iterator

QSet<T>::iterator

QMap<Key,T>,QMultiMap<Key,T>

QMap<T>::const_iterator

QMap<T>::iterator

QHash<Key,T>,QMultiHash<Key,T>

QHash<T>::const_iterator

QHash<T>::iterator

//java风格迭代器QList<int>list;list<<1<<2<<3<<4<<5;QListIterator<int>it(list);while(it.hasNext()){qDebug()<<it.next();}//STL风格迭代器QList<int>list2={1,2,3,4,5};QList<int>::iteratorit;//定义一个读写迭代器for(it=list2.begin();it!=list2.end();it++){qDebug()<<it;}序列式容器QList

QList模板提供了一个列表,实际上是一个指针数组,当项目数小于1000时,可以实现快速的插入删除操作

QList<T>是Qt的通用容器类之一。它将项目存储在一个列表中,该列表提供基于索引的快速访问和基于索引的插入和删除。QList<T>、QLinkedList<T>和QVector<T>提供类似的API和功能。它们通常可以互换,但会产生性能后果。

使用概述:

QVector应该是您的默认首选。QVector<T>通常会比QList<T>提供更好的性能,因为QVector<T>总是将其项按顺序存储在内存中,其中QList<T>将在堆上分配它的项,除非sizeof(T)<=sizeof(void)并且T已使用Q_DECLARE_TYPEINFO声明为Q_MOVABLE_TYPE或Q_PRIMITIVE_TYPE。然而,QList在整个QtAPI被大量使用,用于传递参数和返回值。使用QList可以很方便的与这些API进行交互。如果您需要一个真正的链表,它保证常量时间内插入列表,并且使用迭代器指向项而不是索引,那么请使用QLinkedList。公有函数添加数据

//支持流插入QList<int>()<<1<<2<<3<<4<<5;?voidappend(constT&value)voidappend(constQList<T>&value)voidinsert(inti,constT&value)QList::iteratorinsert(QList::iteratorbefore,constT&value)voidprepend(constT&value)voidpush_back(constT&value)voidpush_front(constT&value)获取数据

T&back()constT&back()constT&first()constT&first()constT&front()constT&front()constT&last()constT&last()constconstT&constFirst()constconstT&constLast()const//返回下标为i的元素,如果下标i不合法,则返回defaultValueTvalue(inti)constTvalue(inti,constT&defaultValue)constconstT&at(inti)constT&operatorconstT&operatorconst//返回从位置pos开始的子列表。如果length为-1(默认),则包含pos中的所有元素;QList<T>mid(intpos,intlength=-1)const删除数据

voidclear()QList::iteratorerase(QList::iteratorpos)QList::iteratorerase(QList::iteratorbegin,QList::iteratorend)voidpop_back()voidpop_front()//删除元素intremoveAll(constT&value)boolremoveOne(constT&value)voidremoveAt(inti)voidremoveFirst()voidremoveLast()//删除元素并返回它,如果不使用返回值,removeAt()会更高效TtakeAt(inti)TtakeFirst()TtakeLast()查找/替换

//返回value在列表中第一次出现的索引位置,从索引位置from向前搜索。如果没有匹配的项,则返回-1。intindexOf(constT&value,intfrom=0)const//返回value在列表中最后一次出现的索引位置,从索引位置from反向搜索。如果from是-1(默认值),则搜索从最后一项开始。如果没有匹配的项,则返回-1。intlastIndexOf(constT&value,intfrom=-1)const//将索引位置为i的项替换为valuevoidreplace(inti,constT&value)//如果列表中包含值的出现,则返回true;否则返回false。该函数要求值类型具有operator==()的实现。boolcontains(constT&value)const交换/移动

//将索引位置from到索引位置to//[“A”,“B”,“C”,“D”,“E”,“F”]move(1,4)->[“A”,“C”,“D”,“E”,“B”,“F”]voidmove(intfrom,intto)voidswap(QList<T>&other)//交换下标ij的元素voidswapItemsAt(inti,intj)判断函数

intcount(constT&value)constintcount()constintsize()constintlength()constboolempty()constboolisEmpty()const//如果列表第一项/后一项等于value,则返回true;否则返回false。boolstartsWith(constT&value)constboolendsWith(constT&value)const//预分配空间大小voidreserve(intalloc)和其他容器互转

QSet<T>toSet()conststd::list<T>toStdList()constQVector<T>toVector()const[static]QList<T>fromSet(constQSet<T>&set)[static]QList<T>fromStdList(conststd::list<T>&list)[static]QList<T>fromVector(constQVector<T>&vector)QStringList

QStringList继承自QList<QString>。它提供基于索引的快速访问以及快速插入和删除。将字符串列表作为值参数传递既快速又安全。QList的所有功能也适用于QStringList。例如,可以使用isEmpty()来测试列表是否为空,还可以调用append()、prepend()、insert()、replace()、removeAll()、removeAt()、removeFirst()、removeLast()和removeOne()等函数来修改QStringList。此外,QStringList提供了一些方便的函数,使处理字符串列表更容易:

判断是否包含某个字符串

boolcontains(constQString&str,Qt::CaseSensitivitycs=Qt::CaseSensitive)constboolcontains(QLatin1Stringstr,Qt::CaseSensitivitycs=Qt::CaseSensitive)constboolcontains(QStringViewstr,Qt::CaseSensitivitycs=Qt::CaseSensitive)const过滤:返回包含子字符串str的所有字符串的列表

QStringListfilter(constQString&str,Qt::CaseSensitivitycs=Qt::CaseSensitive)constQStringListfilter(QStringViewstr,Qt::CaseSensitivitycs=Qt::CaseSensitive)constQStringListfilter(constQRegExp&rx)constQStringListfilter(constQRegularExpression&re)const查找

//从左往右查找intindexOf(constQRegExp&rx,intfrom=0)constintindexOf(QStringViewstr,intfrom=0)constintindexOf(QLatin1Stringstr,intfrom=0)constintindexOf(QRegExp&rx,intfrom=0)constintindexOf(constQRegularExpression&re,intfrom=0)const//从右往左查找intlastIndexOf(constQRegExp&rx,intfrom=-1)constintlastIndexOf(QStringViewstr,intfrom=-1)constintlastIndexOf(QLatin1Stringstr,intfrom=-1)constintlastIndexOf(QRegExp&rx,intfrom=-1)constintlastIndexOf(constQRegularExpression&re,intfrom=-1)const连接:将QStringList中的所有字符串连接为一个字符串,每个元素由给定的分隔符(可以是空串)分隔。

//支持流插入<<QStringjoin(constQString&separator)constQStringjoin(QStringViewseparator)constQStringjoin(QLatin1Stringseparator)constQStringjoin(QCharseparator)const删除:从QStringList中删除重复的元素。返回已删除元素的数量。

intremoveDuplicates()替换:返回一个字符串列表,其中每个字符串在找到before文本时都将before文本替换为after文本【领更多QT学习资料,点击下方链接免费领取↓↓,先码住不迷路~】

点击→领Qt开发必备技术栈学习路线+资料

QStringList&replaceInStrings(constQString&before,constQString&after,Qt::CaseSensitivitycs=Qt::CaseSensitive)QStringList&replaceInStrings(QStringViewbefore,QStringViewafter,Qt::CaseSensitivitycs=Qt::CaseSensitive)QStringList&replaceInStrings(constQString&before,QStringViewafter,Qt::CaseSensitivitycs=Qt::CaseSensitive)QStringList&replaceInStrings(QStringViewbefore,constQString&after,Qt::CaseSensitivitycs=Qt::CaseSensitive)QStringList&replaceInStrings(constQRegExp&rx,constQString&after)QStringList&replaceInStrings(constQRegularExpression&re,constQString&after)排序:升序

voidsort(Qt::CaseSensitivitycs=Qt::CaseSensitive)QLinkedList

单链表

QVector

//返回vector底层数组指针。只要不重新分配vector对象,指针就保持有效。这个函数在将vector传递给接受普通c++数组的函数时非常有用。T*data()constT*data()const//将value赋给向量中的所有项。如果size不同于-1(默认值),则vector的大小将被调整为size之前的大小。QVector<T>&fill(constT&value,intsize=-1)QStack

Tpop()voidpush(constT&t)voidswap(QStack<T>&other)T&top()constT&top()constQQueue

//删除队头并返回它Tdequeue()//将值t加到队尾voidenqueue(constT&t)//返回队头的引用T&head()constT&head()constvoidswap(QQueue<T>&other)关联式容器QMap

QMap<Key,T>是Qt的通用容器类之一。它存储(键,值)对,并提供与键关联的值的快速查找。QMap和QHash提供非常相似的功能。区别在于:

QHash提供比QMap更快的平均查找速度。在迭代QHash时,项目是任意排序的。使用QMap,项目总是按键排序。QHash的键类型必须提供operator==()和全局qHash(Key)函数。QMap的键类型必须提供operator<()指定总顺序。从Qt5.8.1开始,使用指针类型作为键也是安全的,即使底层operator<()不提供全序。公有函数添加数据

//插入新的键值对,如果已经有一个键为key的项,则该项的值将被value替换;如果有多个键为key的项,则最近插入的项的值将被value替换。QMap::iteratorinsert(constKey&key,constT&value)QMap::iteratorinsert(QMap::const_iteratorpos,constKey&key,constT&value)//插入新的键值对,如果在map中已经有一个具有相同键的项,这个函数将创建一个新的项QMap::iteratorinsertMulti(constKey&key,constT&value)QMap::iteratorinsertMulti(QMap::const_iteratorpos,constKey&key,constT&value)获取数据

T&first()constT&first()constconstKey&firstKey()constconstKeykey(constT&value,constKey&defaultKey=Key())constQList<Key>keys()constQList<Key>keys(constT&value)constT&last()constT&last()constconstKey&lastKey()const//返回一个列表,该列表包含映射中的所有键。在映射中出现多次的键在返回的列表中只出现一次。QList<Key>uniqueKeys()const//将其他map中的所有项目插入到该map中。QMap<Key,T>&unite(constQMap<Key,T>&other)constTvalue(constKey&key,constT&defaultValue=T())constQList<T>values()constQList<T>values(constKey&key)constT&operatorconstToperatorconst删除数据

voidclear()QMap::iteratorerase(QMap::iteratorpos)intremove(constKey&key)Ttake(constKey&key)查找

boolcontains(constKey&key)const/返回两个迭代器迭代器1:是指向当前map容器中第一个大于或等于key的键值对的迭代器(lowerBound())。迭代器2:是指向当前map容器中第一个大于key的键值对的迭代器。(upperBound())/QPair<QMap::iterator,QMap::iterator>equal_range(constKey&key)QPair<QMap::const_iterator,QMap::const_iterator>equal_range(constKey&key)constQMap::iteratorfind(constKey&key)QMap::const_iteratorfind(constKey&key)constQMap::iteratorlowerBound(constKey&key)QMap::const_iteratorlowerBound(constKey&key)constQMap::iteratorupperBound(constKey&key)QMap::const_iteratorupperBound(constKey&key)const判断

intcount(constKey&key)constintcount()constintsize()constboolempty()constboolisEmpty()constQMultiMap插入和替换:插入新的键值对。如果已经有一个键为key的项,则该项的值将被value替换。如果有多个键为key的项,则最近插入的项的值将被value替换。

typenameQMap<Key,T>::iteratorreplace(constKey&key,constT&value)QHash添加数据

QHash::iteratorinsert(constKey&key,constT&value)QHash::iteratorinsertMulti(constKey&key,constT&value)获取数据

constKeykey(constT&value)constconstKeykey(constT&value,constKey&defaultKey)constQList<Key>keys()constQList<Key>keys(constT&value)constQList<Key>uniqueKeys()constQHash<K,V>&unite(constQHash<K,V>&other)constTvalue(constKey&key)constconstTvalue(constKey&key,constT&defaultValue)constQList<T>values()constQList<T>values(constKey&key)const删除数据

voidclear()QHash::iteratorerase(QHash::const_iteratorpos)QHash::iteratorerase(QHash::iteratorpos)QPair<QHash::iterator,QHash::iterator>equal_range(constKey&key)QPair<QHash::const_iterator,QHash::const_iterator>equal_range(constKey&key)constintremove(constKey&key)Ttake(constKey&key)查找

boolcontains(constKey&key)constQHash::iteratorfind(constKey&key)QHash::const_iteratorfind(constKey&key)const判断

intcount(constKey&key)constintcount()constintsize()constboolempty()constQMultiHash

继承自QHash

typenameQHash<Key,T>::iteratorreplace(constKey&key,constT&value)案例

classGrade//班级{public:Grade(intnumber,constQString&GradeName):number(number),name(GradeName){}friendQDebugoperator<<(QDebugout,constGrade&stu);friendbooloperator==(constGrade&left,constGrade&right);frienduintqHash(constGrade&stu,uintseed=0);private:intnumber;//班级号QStringname;};QDebugoperator<<(QDebugout,constGrade&stu){out<<“[”<<stu.number<<“,”<<stu.name<<“]”;returnout;}booloperator==(constGrade&left,constGrade&right){return(left.number==right.number);}uintqHash(constGrade&stu,uintseed){returnstu.number;}intmain(intargc,char*argv[]){QCoreApplicationa(argc,argv);QHash<Grade,QString>hash;hash.insert(Grade(1403,“安卓”),“张三”);hash.insert(Grade(1406,“苹果”),“李四”);qDebug()<<hash;returna.exec();}QSet添加数据

QSet::iteratorinsert(constT&value)获取数据

QList<T>values()constQList<T>toList()const删除数据

voidclear()QSet::iteratorerase(QSet::const_iteratorpos)QSet::iteratorerase(QSet::iteratorpos)boolremove(constT&value)查找

boolcontains(constT&value)constboolcontains(constQSet<T>&other)constQSet::const_iteratorfind(constT&value)constQSet::iteratorfind(constT&value)其他

intcount()constboolempty()constboolisEmpty()constintsize()const交集,差集,并集

//并集:ohter集合中不在这个集合中的每一项都被插入到这个集合中。返回对该集合的引用。QSet<T>&unite(constQSet<T>&other)//差集:从该集合中删除包含在ohter集合中的所有项。返回对该集合的引用。QSet<T>&QSet::subtract(constQSet<T>&other)//交集:从该集合中删除ohter集合中不包含的所有项。返回对该集合的引用。QSet<T>&intersect(constQSet<T>&other)//如果该集合与ohter集合至少有一个共同项,则返回true。boolintersects(constQSet<T>&other)const8.算法

直接使用STL中的算法

QtGlobal

Qt类的头文件都会包含该头文件,所以不用再显式定义了

TqAbs(constT&t) //求绝对值//返回value限定在min至max范围之内的值constT&qBound(constT&min,constT&val,constT&max)//如果p1和p2近似相等,返回trueboolqFuzzyCompare(doublep1,doublep2)boolqFuzzyCompare(floatp1,floatp2)//如果浮点数约等于0,返回trueboolqFuzzyIsNull(doubled)boolqFuzzyIsNull(floatf)//返回无穷大的数doubleqInf()//求最大值和最小值constT&qMax(constT&a,constT&b)constT&qMin(constT&a,constT&b)//四舍五入到最近的整数qint64qRound64(doubled)qint64qRound64(floatd)intqRound(doubled)intqRound(floatd)//获得Qt版本constchar*qVersion()QtMath常用函数

qrealqAcos(qrealv)qrealqAsin(qrealv)qrealqAtan2(qrealy,qrealx)qrealqAtan(qrealv)intqCeil(qrealv)qrealqCos(qrealv)//角度转弧度floatqDegreesToRadians(floatdegrees)doubleqDegreesToRadians(doubledegrees)qrealqExp(qrealv)qrealqFabs(qrealv)intqFloor(qrealv)qrealqLn(qrealv)quint32qNextPowerOfTwo(quint32value)quint64qNextPowerOfTwo(quint64value)quint32qNextPowerOfTwo(qint32value)quint64qNextPowerOfTwo(qint64value)qrealqPow(qrealx,qrealy)floatqRadiansToDegrees(floatradians)doubleqRadiansToDegrees(doubleradians)qrealqSin(qrealv)qrealqSqrt(qrealv)qrealqTan(qrealv)宏

含义

M_E

自然对数的底(欧拉数)

M_LOG2E

以2为底e的对数

M_LOG10E

以10为底的e的对数

M_LN2

2的自然对数

M_LN10

10的自然对数

M_PI

π

M_PI_2

π/2

M_PI_4

π/4

M_1_PI

1/π

M_2_PI

2/π

M_2_SQRTPI

2除以π的平方根,2/√π

M_SQRT2

根号2

M_SQRT1_2

1/√π

本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。