技术标签: Qt 数据类 《嵌入式》Qt5开发笔记 字符串类 基本数据类型 容器类
除了C++提供的基本数据类型之外,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提供了可以比较/判断数据类型值的一般函数和模板函数。下面对这些函数进行简单的介绍:
函数 | 说明 |
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类提供了位数组,通过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类用于定义QPainter图形填充模式。一个笔刷(Brush)可以表现风格、颜色、斜度和质地。比如:
QPainter painter(this);
painter.setBrush(Qt::cyan);
painter.setPen(Qt::darkCyan);
painter.drawRect(0,0,100,100);
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类提供基于RGB、HSV、CMYK的色彩值。换言之,除了用RGB(红绿蓝)构成颜色外,也会将HSV(色调、饱和度、亮度)和CMYK用作构成要素。
QColor主要使用RGB值。为了使用HSV和CMYK,可以使用函数toHsv()和toCmyk()进行转换。
QCursor类可以将鼠标光标指定为任意形状。此类主要用于在特定控件上创建鼠标光标并设置位置。除标准鼠标光标形状外,还可以使用QBitmap、Mask、Hospot创建用户自定义的光标形状。
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 font("Times", 10, QFont::Bold);
QImage类可以访问图像等像素数据,提供与硬件无关的图像显示功能。Qt还提供了与QImage类功能类似的QPixmap、QBitmap、QPicture。
在这四个类中,QPixmap类在操作和显示图像方面功能最佳,而QImage类则在直接访问像素和连接并使用I/O方面表现不俗。
QKeySequence类指定菜单快捷键,提供可快速执行菜单项目的用户界面。通过最常用的Ctrl键和字母的组合方式指定快捷键。
QKeySequence(tr("ctrl+P"));
QKeySequence(Qt::CTRL+Qt::Key_P);
QMargins类指定举行4个区域的边距值,即左、上、下、右这4个区域。
利用函数setLeft()、setRight()、setTop()和setBottom()可以分别设置相应的边距值。
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)、值(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是继承自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类的使用方法与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<QString> list;
list<<"one";
list<<"two";
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>是提供栈算法的类,其结构是后进先出(LIFO)。
QStack<int> stack;
stack.push(1); //入栈
stack.push(2);
while(!stack.isEmpty()){
qDebug()<<stack.pop(); //出栈
}
QQueue<T>类提供了队列算法的类,是先进先出的结构,与栈相反。
QQueue<int> queue;
queue.enqueue(1); //入队列
queue.enqueue(2);
while(!queue.isEmpty()){
qDebug()<<queue.dequeue(); //出队列
}
QSet<T>是Qt容器类之一,保存结构没有指定顺序,故可以快速查找。QSet的内部结构由QHash实现。通过存储QString的方法可以实现初始化。
QSet<QString> set;
set.insert("one");
set<<"two";
QByteArray类提供字节(8位)单位的数组,如下所示将字符数组存储到QByteArray中:
QByteArray ba("Qt");
qDebug()<<ba.size(); //返回2
利用成员函数size()获得字符数组的长度,尽管其中包含了字符串结束标志'\0',但是size()结果中并不显示出来。
为了添加和编辑QByteArray存储的字符数组,Qt提供了成员函数append()、prepend()、insert()、replace()、remove()等等函数。
QByteArrayMatcher类在字节数组中查找匹配的字节数组模式。
QByteArray x("hello qt byebye"); //整体字符串
QByteArray y("qt"); //要寻找的字符串
QByteArrayMatcher matcher(y); //寻找器
qDebug()<<matcher.indexIn(x,0); //寻找匹配
用于支持16位Unicode字符的类。
QString str1="Hello Qt",str2;
QChar* data=str1.data();
while(!data->isNull()){
str2.append(data->unicode());
data++;
}
qDebug()<<str2; //输出“Hello Qt”
QString类支持Unicode字符的字符串,可以存储16位QChar。
QString类可以使用%1、%2~%99的参数范围显示或存储字符串:
QString str=QString("Hello %1 , Byebye %2").arg("Qt").arg("WinForm");
qDebug()<<str;
QStringList类继承自QList<QString>,可进行“<<”运算和大量的成员函数。
QStringMatcher类比较QString字符串,以查找对应的字符。
最终总结起来的部分,可以参考链接: QT数据类型和有用的数据操作类总结。
文章浏览阅读1.1k次。一、选择题1. 串行接口是指( )。A. 接口与系统总线之间串行传送,接口与I/0设备之间串行传送B. 接口与系统总线之间串行传送,接口与1/0设备之间并行传送C. 接口与系统总线之间并行传送,接口与I/0设备之间串行传送D. 接口与系统总线之间并行传送,接口与I/0设备之间并行传送【答案】C2. 最容易造成很多小碎片的可变分区分配算法是( )。A. 首次适应算法B. 最佳适应算法..._874 计算机科学专业基础综合题型
文章浏览阅读9.7k次,点赞5次,收藏15次。连接xshell失败,报错如下图,怎么解决呢。1、通过ps -e|grep ssh命令判断是否安装ssh服务2、如果只有客户端安装了,服务器没有安装,则需要安装ssh服务器,命令:apt-get install openssh-server3、安装成功之后,启动ssh服务,命令:/etc/init.d/ssh start4、通过ps -e|grep ssh命令再次判断是否正确启动..._could not connect to '192.168.17.128' (port 22): connection failed.
文章浏览阅读209次。00000000_杰理 空白芯片 烧入key文件
文章浏览阅读475次。2023年初,“ChatGPT”一词在社交媒体上引起了热议,人们纷纷探讨它的本质和对社会的影响。就连央视新闻也对此进行了报道。作为新传专业的前沿人士,我们当然不能忽视这一热点。本文将全面解析ChatGPT,打开“技术黑箱”,探讨它对新闻与传播领域的影响。_引发对chatgpt兴趣的表述
文章浏览阅读259次。用Python数据分析方法进行汉字声调频率统计分析木合塔尔·沙地克;布合力齐姑丽·瓦斯力【期刊名称】《电脑知识与技术》【年(卷),期】2017(013)035【摘要】该文首先用Python程序,自动获取基本汉字字符集中的所有汉字,然后用汉字拼音转换工具pypinyin把所有汉字转换成拼音,最后根据所有汉字的拼音声调,统计并可视化拼音声调的占比.【总页数】2页(13-14)【关键词】数据分析;数据可..._汉字声调频率统计
文章浏览阅读64次。最近在做一个android系统移植的项目,所使用的开发板com1是调试串口,就是说会有uboot和kernel的调试信息打印在com1上(ttySAC0)。因为后期要使用ttySAC0作为上层应用通信串口,所以要把所有的调试信息都给去掉。参考网上的几篇文章,自己做了如下修改,终于把调试信息重定向到ttySAC1上了,在这做下记录。参考文章有:http://blog.csdn.net/longt..._嵌入式rootfs 输出重定向到/dev/console
文章浏览阅读1.2k次,点赞4次,收藏12次。1,先去iconfont登录,然后选择图标加入购物车 2,点击又上角车车添加进入项目我的项目中就会出现选择的图标 3,点击下载至本地,然后解压文件夹,然后切换到uniapp打开终端运行注:要保证自己电脑有安装node(没有安装node可以去官网下载Node.js 中文网)npm i -g iconfont-tools(mac用户失败的话在前面加个sudo,password就是自己的开机密码吧)4,终端切换到上面解压的文件夹里面,运行iconfont-tools 这些可以默认也可以自己命名(我是自己命名的_uniapp symbol图标
文章浏览阅读1.2w次,点赞25次,收藏192次。char*和char[]都是指针,指向第一个字符所在的地址,但char*是常量的指针,char[]是指针的常量_c++ char*
文章浏览阅读930次。代码编辑器或者文本编辑器,对于程序员来说,就像剑与战士一样,谁都想拥有一把可以随心驾驭且锋利无比的宝剑,而每一位程序员,同样会去追求最适合自己的强大、灵活的编辑器,相信你和我一样,都不会例外。我用过的编辑器不少,真不少~ 但却没有哪款让我特别心仪的,直到我遇到了 Sublime Text 2 !如果说“神器”是我能给予一款软件最高的评价,那么我很乐意为它封上这么一个称号。它小巧绿色且速度非
文章浏览阅读4.1k次。一、选择法这是每一个数出来跟后面所有的进行比较。2.冒泡排序法,是两个相邻的进行对比。_对十个数进行大小排序java
文章浏览阅读2.9k次。物联网开发笔记——使用网络调试助手连接阿里云物联网平台(基于MQTT协议)其实作者本意是使用4G模块来实现与阿里云物联网平台的连接过程,但是由于自己用的4G模块自身的限制,使得阿里云连接总是无法建立,已经联系客服返厂检修了,于是我在此使用网络调试助手来演示如何与阿里云物联网平台建立连接。一.准备工作1.MQTT协议说明文档(3.1.1版本)2.网络调试助手(可使用域名与服务器建立连接)PS:与阿里云建立连解释,最好使用域名来完成连接过程,而不是使用IP号。这里我跟阿里云的售后工程师咨询过,表示对应_网络调试助手连接阿里云连不上
文章浏览阅读544次,点赞5次,收藏6次。运算符与表达式任何高级程序设计语言中,表达式都是最基本的组成部分,可以说C++中的大部分语句都是由表达式构成的。_无c语言基础c++期末速成