【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

智能推荐

(完美)华为Mate10 ALP-AL00的usb调试模式在哪里开启的方法_华为alp-al00找不到usb调试开关-程序员宅基地

文章浏览阅读6.4k次。当我们使用Pc接通安卓手机的时候,如果手机没有开启USB调试模式,Pc则无办法成功检测到我们的手机,在一些情况下,我们使用的一些功能较好的软件比如以前我们使用的一个软件引号精灵,老版本就需要开启USB调试模式下使用,现当新版本不需要了,如果遇到这个情况我们需要找方法将手机的USB调试模式开启,以下资料我们讲解华为Mate10 ALP-AL00如何开启USB调试模式的流程。首先,在华为Mate10..._华为alp-al00找不到usb调试开关

web前端期末大作业--HTML+CSS+JS实现美女拼图游戏,2024年最新2024年华为Web前端面试真题解析-程序员宅基地

文章浏览阅读829次,点赞13次,收藏16次。/游戏配置//生成规格横4 纵4//每个元素的间隔margin: 1,//拖动时候块透明度},id: “”,float: “”,width: “”,left: “”,top: “”,//元素生成参数},sortObj: {rightlist: [], //正确的排序romdlist: [] //打乱后的排序},//尺寸自动获取//计算单个div的高宽//图片生成div//创建一个素组并排序打散a++) {sid = 0;

Java代码实现SOAP和REST接口工具类_使用java实现soap接口调用的工具类-程序员宅基地

文章浏览阅读1.1k次。SOAP(Simple Object Access Protocol)和REST(Representational State Transfer)是两种不同的Web服务通信协议,因此它们的接口工具类实现也有一些差异。需要注意的是,这些示例代码只实现了最基本的功能,实际使用时可能需要根据具体情况进行修改和扩展。同时还需要注意安全性和性能等方面的问题,例如SSL证书验证、连接池管理和结果缓存等。_使用java实现soap接口调用的工具类

linux raw socket 原始套接字_linux raw通信-程序员宅基地

文章浏览阅读344次。TCP socket,UDP socket只能处理传输层数据,而原始套接字raw socket绕过传输层直接获取网络链路层的数据包。我们平时用的tcpdump, libpcap都是基于raw socket实现的。一般使用方法如下: // raw socket int rawsock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_IP)); if (rawsock < 0) { perror("SOCK_RAW err_linux raw通信

梯度下降优化算法总结-程序员宅基地

文章浏览阅读1.7w次,点赞14次,收藏74次。本次介绍梯度下降优化算法。主要参考资料为一篇综述《An overview of gradient descent optimization algorithms》_梯度下降优化算法

scanner java重新输入_关于java中scanner对象重复使用的问题-程序员宅基地

文章浏览阅读1.3k次。Scannerscanner=newScanner(System.in);inti=scanner.nextInt();System.out.println(i);intj=scanner.nextInt();System.out.println(j);这样是通过一个scanner对象两次输入分别给两个变量赋值,没有问题,执行后一切正常。Scannerscanner=new..._scanner重复使用

随便推点

PID循迹控制算法_循迹算法-程序员宅基地

文章浏览阅读5.2w次,点赞170次,收藏1.4k次。前言 让小车进行循迹最重要的是获取车相对于循迹线的位置,关于循迹模块的原理我已经在之前的一篇博客上讲过,如果大家没看过的话可以点此链接:PID循迹模块原理。PID循迹原理简介图1 循迹车寻线行走图示图2 市场常见循迹传感器 PID循迹的原理我们大致可以用常识性思维去思考下,如图1所示为循迹车寻线行走图示,现在小车要按照中间那条黑线循迹行走,如果车头往左偏则需要控制方向盘让车往右转,车头往又偏则需要让车往左转。但是仅仅只有左转和右转的话,车一到左边就向右转,一到右边就向左转,则车会来回在线左右晃动_循迹算法

Python 进程+协程并发小练习 假设10w个url地址每个请求1秒尝试用4个进程每个进程开启1000个协程去请求统计运行时间_python每秒并发1000个请求-程序员宅基地

文章浏览阅读8.5k次,点赞9次,收藏12次。练习题目进程+协程实现并发小练习假设一个队列中有100000个url地址,每个请求需要1秒钟,尝试用4个进程每个进程开启1000个协程去请求,统计运行时间示例代码# -*- coding: utf-8 -*-# @Time : 2020/12/22 1:49 下午# @Author : Benjamin# @File : testGevent.py# @Software: PyCharmfrom gevent import monkey;mon..._python每秒并发1000个请求

微信小程序在线考试系统 毕业设计(1)首页_考试小程序首页代码-程序员宅基地

文章浏览阅读2.2k次,点赞3次,收藏25次。wxml代码<view> <!--广告图片 mode="widthFix" 设定高度随宽度自动变化--> <image class="ad01" src="/img/1.png" mode="widthFix"></image></view><view class="chaxun"> <input class="chaxun_zuo" type="text" name="cx_neirong" .._考试小程序首页代码

Java实现“扑克牌游戏”底层逻辑_利用数组随机生成扑克牌-程序员宅基地

Java实现“扑克牌游戏”底层逻辑,包括纸牌类的元素、构造方法和牌堆类的实现。

JavaScript循环_js用户登录验证限制次数while循环做法-程序员宅基地

文章浏览阅读819次。循环是重复性做一件事外面没办法控制每次循环的时间长度循环会增大您的程序时间复杂度(不建议无限循环嵌套 一般情况下不会超过两次)死循环是不会停止的 回导致内存溢出 从而蓝屏循环很多种 常见的三种:while,do while,forwhile循环写法是定义初始值while(布尔类型表达式){循环体 (迭代 初始值变化 操作)var i = 0//初始值定义while (i<5){i++ //不迭代会导致死循环conlose.log(i)//操作 123.._js用户登录验证限制次数while循环做法

图像分割FCN全卷积神经网络_cloudfcn-程序员宅基地

文章浏览阅读1.4k次。FCN全卷积神经网络是图像分割的基础网络FCN实现了端到端的网络,输入mxm图像,输出为mxmxc的图像,其中c代表种类。思想概述FCN叫做全卷积神经网络,顾名思义所有曾都是卷积层!也就是抛掉了全连接层,这是第一个改变;再者卷积神经网络卷到最后特征图尺寸越来越少,分辨率比较小,不适合我们做图像分割,好,这里引入一个上采样的做法,卷积完之后再上采样到大尺寸图;网络又考虑层数不断叠加后原图的信息..._cloudfcn

推荐文章

热门文章

相关标签