【Qt】数据类型和有用的数据操作类_qset初始化-程序员宅基地

技术标签: Qt  数据类  《嵌入式》Qt5开发笔记  字符串类  基本数据类型  容器类  

除了C++提供的基本数据类型之外,Qt还提供了了对开发者而言非常有用的多种数据类型。Qt提供的数据类型分为基本数据类型和类形态的数据类型。

 

基本数据类型

Qt支持多个平台,创建的应用程序需要在多种平台上都具有相同大小的数据类型。为了能精确指定数据类型的大小,Qt提供了一下的基本数据类型:

Qt基本数据类型
类型 大小 说明
bool 8位 true/false
qint8 8位 signed char
qint16 16位 signed short
qint32 32位 signed int
qint64 64位 long long int
quint8 8位 unsigned char
quint16 16位 unsigned short
quint32 32位 unsigned int
qunit64 64位 unsigned long long int
float 32位 浮点数
double 64位 浮点数
const char* 32位 指向字符串常量的指针

比较和判断变量的函数

Qt提供了可以比较/判断数据类型值的一般函数和模板函数。下面对这些函数进行简单的介绍:

Qt比较和判断变量的函数
函数 说明
T qAbs(const T &value) 返回绝对值
const T& qBound(const T& min,const T& value, const T& max) 返回最大值和最小值之间值
void qCritical(const Char* msg) 处理Critical消息的函数
void qDebug(const Char* msg) 输出调试信息的函数
void qFatal(const Char* msg) 处理错误信息的函数
bool qFuzzyCompare(double p1,double p2)[static] 比较浮点值的函数
bool qFuzzyCompare(float p1,float p2)[static] 比较浮点值的函数
QtMsgHandler qInstallMsgHandler(QtMsgHandler handler) 用户自定义函数,输出Qt定义的调试、预警、严重等消息
const T& qMax(const T& value1,const T& value2) 返回两个值中的最大值
const T& qMin(const T& value1,const T& value2) 返回两个值中的最小值
qint64 qRound64(qreal value) 64位整型四舍五入函数
int qRound(qreal value) 整型四舍五入函数

 

数据类

 

Qt提供基本数据类型的同时,为了在开发应用程序时能顺利操作数据,还提供了各种类。

QBitArray

QBitArray类提供了位数组,通过AND、OR、XOR、NOT执行为操作,从而减少不必要的位数据复制造成的内存浪费。

QBitArray类的初始化方法为:

QBitArray ba(200);

QBitArray可以重新调整数组大小。

QBitArray ba;
ba.resize(3);
ba[0] = true;

同样,QBitArray支持&(AND)、|(OR)、^(XOR)、~(NOT)运算。

提供的成员函数可通过false、true操作所有声明为QBitArray类的数组:

QBitArray ba(200);
ba.fill(true);

QBrush

QBrush类用于定义QPainter图形填充模式。一个笔刷(Brush)可以表现风格、颜色、斜度和质地。比如:

QPainter painter(this);
painter.setBrush(Qt::cyan);
painter.setPen(Qt::darkCyan);
painter.drawRect(0,0,100,100);

QByteArray

QByteArray类用于将字符串数据保存到字节数组,可以保存Raw数据和字符串(String)型(包括最后的'\0')的字节。与const char等字符常量想比,更简单易用。QByteArray在复制同一内存区域的字符串期间,会访问其它处理器,减少内存占用,从而高效使用内存。

因此,在嵌入式Linux平台使用QByteArray时,可提高内存的使用效率。

QByteArray类可将字符串保存到构造函数:

QByteArray ba("Hello");

除了使用构造函数存储字符串的方法外,还可以使用函数resize()动态分配大小:

QByteArray ba;
ba.resize(5);
ba[0] = 0x3c;
ba[1] = 0xb8;
ba[2] = 0x64;
ba[3] = 0x18;
ba[4] = 0xca;

可以使用at()函数读取数组中特定位置的数据:

for(int i=0;i<ba.size();i++){
        if(ba.at(i)>='a'&&ba.at(i)<='f')
                cout<<"Found in range [a-f]"<<endl;
}

QByteArray可以使字节数组包含字符串结束符'\0'。此时,如果利用函数size()返回数组字符串的整体大小,则其内不包含'\0'。

QByteArray ba1("ca\0r\0t");
qDebug()<<ba1.size();                        //返回2
qDebug()<<ba1.constData();

QByteArray ba2("ca\0r\0t",3);
qDebug()<<ba2.size();                        //返回3
qDebug()<<ba2.constData();

QByteArray ba3("ca\0r\0t",4);
qDebug()<<ba3.size();                        //返回4
qDebug()<<ba3.constData();

const char cart[]={'c','a','\0','r','\0','t'};
QByteArray ba4(QByteArray::fromRawData(cart,6));
qDebug()<<ba4.size();                        //返回6
qDebug()<<ba4.constData();

QByteArray提供的成员函数可以在字符串的前半部分或后半部分添加字符和字符串,并可更换特定位置的数据。

QByteArray x("and");
qDebug()<<x.prepend("rock ");                    //返回“rock and”
qDebug()<<x.append(" roll");                      //返回"rock and roll"  
qDebug()<<x.replace(5,3,"&");                        //返回“rock & roll”

QByteArray可以解码(Decode)Base 64格式的数据,使用成员函数FromBase64()即可。

QByteArray text=QByteArray::fromBase64("UXQgaXMgZ3JlYXQh");
qDebug()<<text.data();                    //返回Qt is great!

使用基于Base64编码(encode)的数据的算法使用的是RFC2045。此外,还可以改变保存为十六进制的数据,以及URL/URI格式输入的编码数据。

QByteArray text=QByteArray::fromHex("517420697320677265617421");
qDebug()<<text.data();

QByteArray text1=QByteArray::fromPercentEncoding("Qt%20is%20great%33");
qDebug()<<text1.data();

可以返回从字符串数组左边开始指定位置的数据。函数left()将指定的大小转换为参数:

QByteArray x("Pineapple");
QByteArray y=x.left(4);
qDebug()<<y;                            //返回“Pine”

此外,如果使用函数leftJustfied(),则可以使用从特定位置字符串之后开始指定的字符:

QByteArray x("apple");
QByteArray y=x.leftJustified(8,'.');
qDebug()<<y;                            //返回“apple...”

QByteArray还可以将储存的字符串数据变为int、float、long等类型的数据并保存。

QByteArray str("FF");
bool ok;
int hex=str.toInt(&ok,16);
int dec=str.toInt(&ok,10);
qDebug()<<hex<<dec;

QColor

QColor类提供基于RGB、HSV、CMYK的色彩值。换言之,除了用RGB(红绿蓝)构成颜色外,也会将HSV(色调、饱和度、亮度)和CMYK用作构成要素。

QColor主要使用RGB值。为了使用HSV和CMYK,可以使用函数toHsv()和toCmyk()进行转换。

QCursor

QCursor类可以将鼠标光标指定为任意形状。此类主要用于在特定控件上创建鼠标光标并设置位置。除标准鼠标光标形状外,还可以使用QBitmap、Mask、Hospot创建用户自定义的光标形状。

QDate

QDate类提供有关日期的功能。使用系统时钟(Clock)读取当前日期的年、月、日;QDate利用函数currentDate()读取当前时间,利用函数fromString()在字符中说明日期。

QDate类通过year()、mouth()和day()函数读取年、月、日,而且可以读取罗马字母格式的日期简称和全程。像给int型增加数字一样,利用函数addYears()、addMouths()和addDays()给当前日期的年、月、日增加参数值。

QDate类提供比较日期的功能:

QDate d1(1999,1,1);
QDate d2(2000,3,2);
qDebug()<<d1.daysTo(d2);                    //返回426

QDate类通过文本格式显示所有输入的字符,因此,显示日期的模式字符必须放在引号内输入:

QDate d1=QDate::fromString("02.25","MM.dd");
QString str=d1.toString("yyyy.MM.dd");
qDebug()<<str;

QFont

QFont类指定字体的属性,可以使用文字的字号、颜色、加粗、下划线、倾斜等属性。

QFont font("Times", 10, QFont::Bold);

QImage

QImage类可以访问图像等像素数据,提供与硬件无关的图像显示功能。Qt还提供了与QImage类功能类似的QPixmap、QBitmap、QPicture。

在这四个类中,QPixmap类在操作和显示图像方面功能最佳,而QImage类则在直接访问像素和连接并使用I/O方面表现不俗。

QKeySequence

QKeySequence类指定菜单快捷键,提供可快速执行菜单项目的用户界面。通过最常用的Ctrl键和字母的组合方式指定快捷键。

QKeySequence(tr("ctrl+P"));
QKeySequence(Qt::CTRL+Qt::Key_P);

QMargins

QMargins类指定举行4个区域的边距值,即左、上、下、右这4个区域。

利用函数setLeft()、setRight()、setTop()和setBottom()可以分别设置相应的边距值。

QUrl

QUrl类在使用URL的界面中很好用,它提供了多种功能以操作编码或未编码的URL。

QUrl url("www.lvchademiao.com/list of time");
qDebug()<<url.toEncoded();
qDebug()<<QUrl::fromEncoded("www.lvchademiao.com/list%20of%20time");

 

容器类

与STL相比,Qt提供的容器类使用起来更安全、更简单,而且都是轻量化的。因此Qt提供的容器类可以代替STL提供的容器类。

QHash<Key,T>

QHash类提供了基于散列表的字典。存储方式时键(Key)、值(Value)成对存储。通过键可以检索到要查的数据。QHash的功能虽然与QMap的功能非常类似,但其内部运算比QMap要更快。

为了通过键值使用QString且存储int,可进行如下声明:

QHash<QString,int> hash;
    
hash["one"]=1;                        //存值
hash.insert("seven",7);                //存值
    
int num1=hash["one"];                    //取值
int num2=hash.value("seven");            //取值
qDebug()<<num1<<num2;

QMultiHash<Key,T>

QMultiHash是继承自QHash的类,比QHash更适合存储多种散列值。虽然QHash不允许一键多值,但是QMultiHash却允许。因此QMultiHash提供了QHash扩大形态的类功能。

QMultiHash可以将存储为多值的项转换为QList的项:

QList<int> list=hash.values("number");
for(int i=0;i<list.size();i++){
        qDebug()<<list.at(i);
}

QList<T>

QList<T>以列表形态存储并管理值,并能进行基于快速索引的访问,还可以快速删除数据。QList类的使用方法与QLinkedList、QVector类的使用方法类似。

QList是基于索引的类,比QLinkedList的迭代器使用起来更方便,存储数据时分配内存的速度比QVector快。

比较不一样的是QList使用运算符将内容添加到列表。

QList<QString> list;
list<<"one"<<"two"<<"three";                //向列表添加值
for(int i=0;i<list.size();i++){
        if(list.at(i)=="two")
                qDebug()<<list.at(i);                    //从列表取值
}

QLinkedList<T>

QLinkedList<T>类基于迭代器,可以插入和删除列表的项目。

QLinkedList<QString> list;
list<<"one";
list<<"two";

QVector<T>

QVector<T>作为容器类之一,可以快速存储相关项目到存储器的位置,并提供基于索引的快速访问。

QVector将项目存储到向量,一般在声明的同时分配向量大小:

QVector<QString> vector(20);
vector<<"one";
vector.append("two");
qDebug()<<vector.at(0);
vector[0]="three";
qDebug()<<vector.at(0);

当使用“<<”或者append()函数时,是在整个向量的末尾添加项目。

QStack<T>

QStack<T>是提供栈算法的类,其结构是后进先出(LIFO)。

QStack<int> stack;
stack.push(1);                    //入栈
stack.push(2);
while(!stack.isEmpty()){
        qDebug()<<stack.pop();            //出栈
}

QQueue<T>

QQueue<T>类提供了队列算法的类,是先进先出的结构,与栈相反。

QQueue<int> queue;
queue.enqueue(1);                //入队列
queue.enqueue(2);
while(!queue.isEmpty()){
        qDebug()<<queue.dequeue();            //出队列
}

QSet<T>

QSet<T>是Qt容器类之一,保存结构没有指定顺序,故可以快速查找。QSet的内部结构由QHash实现。通过存储QString的方法可以实现初始化。

QSet<QString> set;
set.insert("one");
set<<"two";

 

字符串类

QByteArray

QByteArray类提供字节(8位)单位的数组,如下所示将字符数组存储到QByteArray中:

QByteArray ba("Qt");
qDebug()<<ba.size();            //返回2

利用成员函数size()获得字符数组的长度,尽管其中包含了字符串结束标志'\0',但是size()结果中并不显示出来。

为了添加和编辑QByteArray存储的字符数组,Qt提供了成员函数append()、prepend()、insert()、replace()、remove()等等函数。

QByteArrayMatcher

QByteArrayMatcher类在字节数组中查找匹配的字节数组模式。

QByteArray x("hello qt byebye");                    //整体字符串
QByteArray y("qt");                                //要寻找的字符串

QByteArrayMatcher matcher(y);                //寻找器
qDebug()<<matcher.indexIn(x,0);                //寻找匹配

QChar

用于支持16位Unicode字符的类。

QString str1="Hello Qt",str2;
QChar* data=str1.data();
while(!data->isNull()){
        str2.append(data->unicode());
        data++;
}
qDebug()<<str2;                    //输出“Hello Qt”

QString

QString类支持Unicode字符的字符串,可以存储16位QChar。

QString类可以使用%1、%2~%99的参数范围显示或存储字符串:

QString str=QString("Hello %1 , Byebye %2").arg("Qt").arg("WinForm");
qDebug()<<str;

QStringList

QStringList类继承自QList<QString>,可进行“<<”运算和大量的成员函数。

QStringMatcher

QStringMatcher类比较QString字符串,以查找对应的字符。

 

最终总结起来的部分,可以参考链接: QT数据类型和有用的数据操作类总结

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_38410730/article/details/80762778

智能推荐

WCE Windows hash抓取工具 教程_wce.exe -s aaa:win-9r7tfgsiqkf:0000000000000000000-程序员宅基地

文章浏览阅读6.9k次。WCE 下载地址:链接:https://share.weiyun.com/5MqXW47 密码:bdpqku工具界面_wce.exe -s aaa:win-9r7tfgsiqkf:00000000000000000000000000000000:a658974b892e

各种“网络地球仪”-程序员宅基地

文章浏览阅读4.5k次。Weather Globe(Mackiev)Google Earth(Google)Virtual Earth(Microsoft)World Wind(NASA)Skyline Globe(Skylinesoft)ArcGISExplorer(ESRI)国内LTEarth(灵图)、GeoGlobe(吉奥)、EV-Globe(国遥新天地) 软件名称: 3D Weather Globe(http:/_网络地球仪

程序员的办公桌上,都出现过哪些神奇的玩意儿 ~_程序员展示刀,产品经理展示枪-程序员宅基地

文章浏览阅读1.9w次,点赞113次,收藏57次。我要买这些东西,然后震惊整个办公室_程序员展示刀,产品经理展示枪

霍尔信号、编码器信号与电机转向-程序员宅基地

文章浏览阅读1.6w次,点赞7次,收藏63次。霍尔信号、编码器信号与电机转向从电机出轴方向看去,电机轴逆时针转动,霍尔信号的序列为编码器信号的序列为将霍尔信号按照H3 H2 H1的顺序组成三位二进制数,则霍尔信号翻译成状态为以120°放置霍尔为例如不给电机加电,使用示波器测量三个霍尔信号和电机三相反电动势,按照上面所说的方向用手转动电机得到下图① H1的上升沿对应电机q轴与H1位置电角度夹角为0°,..._霍尔信号

个人微信淘宝客返利机器人搭建教程_怎么自己制作返利机器人-程序员宅基地

文章浏览阅读7.1k次,点赞5次,收藏36次。个人微信淘宝客返利机器人搭建一篇教程全搞定天猫淘宝有优惠券和返利,仅天猫淘宝每年返利几十亿,你知道么?技巧分享:在天猫淘宝京东拼多多上挑选好产品后,按住标题文字后“复制链接”,把复制的淘口令或链接发给机器人,复制机器人返回优惠券口令或链接,再打开天猫或淘宝就能领取优惠券啦下面教你如何搭建一个类似阿可查券返利机器人搭建查券返利机器人前提条件1、注册微信公众号(订阅号、服务号皆可)2、开通阿里妈妈、京东联盟、拼多多联盟一、注册微信公众号https://mp.weixin.qq.com/cgi-b_怎么自己制作返利机器人

【团队技术知识分享 一】技术分享规范指南-程序员宅基地

文章浏览阅读2.1k次,点赞2次,收藏5次。技术分享时应秉持的基本原则:应有团队和个人、奉献者(统筹人)的概念,同时匹配团队激励、个人激励和最佳奉献者激励;团队应该打开工作内容边界,成员应该来自各内容方向;评分标准不应该过于模糊,否则没有意义,应由客观的基础分值以及分团队的主观综合结论得出。应有心愿单激励机制,促进大家共同聚焦到感兴趣的事情上;选题应有规范和框架,具体到某个小类,这样收获才有目标性,发布分享主题时大家才能快速判断是否是自己感兴趣的;流程和分享的模版应该有固定范式,避免随意的格式导致随意的内容,评分也应该部分参考于此;参会原则,应有_技术分享

随便推点

O2OA开源企业办公开发平台:使用Vue-CLI开发O2应用_vue2 oa-程序员宅基地

文章浏览阅读1k次。在模板中,我们使用了标签,将由o2-view组件负责渲染,给o2-view传入了两个参数:app="内容管理数据"和name="所有信息",我们将在o2-view组件中使用这两个参数,用于展现“内容管理数据”这个数据应用下的“所有信息”视图。在o2-view组件中,我们主要做的事是,在vue组件挂载后,将o2的视图组件,再挂载到o2-view组件的根Dom对象。当然,这里我们要在我们的O2服务器上创建好数据应用和视图,对应本例中,就是“内容管理数据”应用下的“所有信息”视图。..._vue2 oa

[Lua]table使用随笔-程序员宅基地

文章浏览阅读222次。table是lua中非常重要的一种类型,有必要对其多了解一些。

JAVA反射机制原理及应用和类加载详解-程序员宅基地

文章浏览阅读549次,点赞30次,收藏9次。我们前面学习都有一个概念,被private封装的资源只能类内部访问,外部是不行的,但这个规定被反射赤裸裸的打破了。反射就像一面镜子,它可以清楚看到类的完整结构信息,可以在运行时动态获取类的信息,创建对象以及调用对象的属性和方法。

Linux-LVM与磁盘配额-程序员宅基地

文章浏览阅读1.1k次,点赞35次,收藏12次。Logical Volume Manager,逻辑卷管理能够在保持现有数据不变的情况下动态调整磁盘容量,从而提高磁盘管理的灵活性/boot分区用于存放引导文件,不能基于LVM创建PV(物理卷):基于硬盘或分区设备创建而来,生成N多个PE,PE默认大小4M物理卷是LVM机制的基本存储设备,通常对应为一个普通分区或整个硬盘。创建物理卷时,会在分区或硬盘的头部创建一个保留区块,用于记录 LVM 的属性,并把存储空间分割成默认大小为 4MB 的基本单元(PE),从而构成物理卷。

车充产品UL2089安规测试项目介绍-程序员宅基地

文章浏览阅读379次,点赞7次,收藏10次。4、Dielecteic voltage-withstand test 介电耐压试验。1、Maximum output voltage test 输出电压试验。6、Resistance to crushing test 抗压碎试验。8、Push-back relief test 阻力缓解试验。7、Strain relief test 应变消除试验。2、Power input test 功率输入试验。3、Temperature test 高低温试验。5、Abnormal test 故障试验。

IMX6ULL系统移植篇-系统烧写原理说明_正点原子 imx6ull nand 烧录-程序员宅基地

文章浏览阅读535次。镜像烧写说明_正点原子 imx6ull nand 烧录