【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

智能推荐

基于JSP后台的志愿者小程序 毕业设计毕设作品欣赏_jsp参赛作品-程序员宅基地

文章浏览阅读767次。基于JSP后台的志愿者小程序_jsp参赛作品

固定资产管理系统日常业务有哪些-程序员宅基地

文章浏览阅读364次,点赞4次,收藏5次。它可以帮助企业完成固定资产的全生命周期管理,提升资产管理效率,降低成本。它涉及公司的长期投资、资产保值和资产报表的准确性。资产处理:当资产达到预定使用期或无法继续使用时,系统需要记录资产处理信息,包括处理日期、处理方法和价格。资产维护:系统需要提醒公司定期维护资产,以确保资产的正常使用。同时,系统还应记录维护的详细信息,包括维护日期、维护内容和维护费用。资产应用:系统需要记录使用单位、使用人员、使用次数等每个资产的使用情况。该系统可实现固定资产的高效管理,提升资产管理效率,降低成本。

android源码--activity启动源码分析_源码 判断启动的activity是否是 instant app-程序员宅基地

文章浏览阅读518次。1.app应用的真正入口是ActivityThread类中的main()方法。 2.调用Looper.prepareMainLooper()方法。 3.调用prepare(false)方法,这里的threadLocal其实就是一个map集合。这样新创建了一个Looper对象,添加到集合中。 在Looper的构造器中,初始化了消息队列并且获取当前的线程 4.调用myLoope..._源码 判断启动的activity是否是 instant app

如何获取Gradle dependencies report(gradle依赖报告)_gradle license dependency report-程序员宅基地

文章浏览阅读1.2k次。这部分内容是之前那个依赖测试包问题看到的答案下面的,有一位大佬梳理了一下这个过程,我在这边翻译一下也供大家参考吧:步骤1在项目根目录下执行获取依赖报告的gradle,比如gradle -q app:dependencies 详细的可以看这里这可以提供与该问题有关的以ASCⅡ码呈现的树,它会帮助你判断哪些是有冲突的版本+--- com.android.support.t..._gradle license dependency report

会动的底部导航栏-Lottie的应用-程序员宅基地

文章浏览阅读415次,点赞5次,收藏4次。随着Android的发展,用户审美的不断提高,你的app不仅得足够好用,UI也得让人感觉赏心悦目,今天无意间打开CSDN看帖子时,发现点击底部导航栏时,图标是会播放动画的,一时好奇是如何实现的,然后就浅浅的研究了下~

centos误删yum,重新安装yum的正确姿势_centos8 误删yum和dnf安装yum和dnf-程序员宅基地

文章浏览阅读3k次。1.针对误卸载yum卸载pythonrpm -qa|grep python|xargs rpm -e --allmatches --nodepswhereis python|xargs rm -fr2.卸载yumrpm -qa|grep yum|xargs rpm -e --allmatches --nodepswhereis yum|xargs rm -fr3.新建一个文..._centos8 误删yum和dnf安装yum和dnf

随便推点

软件工程文档编写标准包括哪些内容_工程文档写作都有什么-程序员宅基地

文章浏览阅读1.2k次。在项目开发过程中,应该按要求编写好十三种文档,文档编制要求具有针对性、精确性、清晰性、完整性、灵活性、可追溯性。   ◇ 可行性分析报告:说明该软件开发项目的实现在技术上、经济上和社会因素上的可行性,评述为了合理地达到开发目标可供选择的各种可能实施方案,说明并论证所选定实施方案的理由。   ◇ 项目开发计划:为软件项目实施方案制订出具体计划,应该包括各部分工作的负责人员、开发的进度、开发经费的_工程文档写作都有什么

互联网产品中的平台、社区、软件、网站、品牌等科普_小米社区和oppo社区 谁算是交易型社区-程序员宅基地

文章浏览阅读2k次。科普大杂烩_小米社区和oppo社区 谁算是交易型社区

STL模型分割工具:解放3D打印的尺寸限制_分解stl模型-程序员宅基地

文章浏览阅读334次,点赞6次,收藏5次。STL模型分割工具是一个简单易用的在线应用,无需安装任何软件,只需通过网页浏览器即可操作。_分解stl模型

LeetCode刷题总结(九)29 - 31 -- 二进制倍增,位运算,滑动窗口_leetcode 倍增-程序员宅基地

文章浏览阅读217次。(一)LeetCode29:两数相除暴力做法是循环 x -= y,x为被除数,y为除数,减到 x 小于 y 为止,每减一次计数变量 ++,最后输出计数变量。然而以上这种做法显然是会超时的!!!高级解法是二进制移位倍增,其实这也是计算机实现乘除法的本质。..._leetcode 倍增

三缸活塞泵 三角机器人 路由器盖板模具设计 打印机 烘箱滚筒控制板 变频器盒模具设计 机械臂末端执行器 上料机 无人机 摩托车 装配自动线 电机三维图-程序员宅基地

文章浏览阅读93次。3D digital model drawing of three-degree-of-freedom planetary gearbox Solidworks design with STEP/三自由度行星变速箱3D数模图纸 Solidworks设计 附STEP。STP format of 3D drawing of simple model of three-wheeled motorcycle/摆摊三轮摩托车简易模型3D图纸STP格式。

句柄泄露调试_vs上进程最大句柄数和exe最大句柄数差异-程序员宅基地

文章浏览阅读10w+次,点赞2次,收藏10次。句柄泄露调试(Handles Leak Debug) 一、概述 造成句柄泄露的主要原因,是进程在调用系统文件之后,没有释放已经打开的文件句柄。 对于句柄泄露,轻则影响某个功能模块正常运行,重则导致整个应用程序崩溃。在 Windows系统中, GDI 句柄上限是 12000 个,USER 句柄上限是 18000 个。 与 Windows 系统的设置不同,Linux 系统对进程可以调用的文件句柄_vs上进程最大句柄数和exe最大句柄数差异

推荐文章

热门文章

相关标签