技术标签: 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数据类型和有用的数据操作类总结。
文章浏览阅读3.3k次,点赞7次,收藏39次。CPU 执行现行程序的过程中,出现某些急需处理的异常情况或特殊请求,CPU暂时中止现行程序,而转去对异常情况或特殊请求进行处理,处理完毕后再返回现行程序断点处,继续执行原程序。void 函数名(void) interrupt n using m {中断函数内容 //尽量精简 }编译器会把该函数转化为中断函数,表示中断源编号为n,中断源对应一个中断入口地址,而中断入口地址的内容为跳转指令,转入本函数。using m用于指定本函数内部使用的工作寄存器组,m取值为0~3。该修饰符可省略,由编译器自动分配。_51单片机中断篇
文章浏览阅读396次。项目经验(案例一)项目时间:2009-10 - 2009-12项目名称:中驰别克信息化管理整改完善项目描述:项目介绍一,建立中驰别克硬件档案(PC,服务器,网络设备,办公设备等)二,建立中驰别克软件档案(每台PC安装的软件,财务,HR,OA,专用系统等)三,能过建立的档案对中驰别克信息化办公环境优化(合理使用ADSL宽带资源,对域进行调整,对文件服务器进行优化,对共享打印机进行调整)四,优化完成后..._网络工程师项目经历
文章浏览阅读1k次,点赞31次,收藏30次。LVS:Linux Virtual Server,负载调度器,内核集成, 阿里的四层SLB(Server Load Balance)是基于LVS+keepalived实现。NATTUNDR优点端口转换WAN性能最好缺点性能瓶颈服务器支持隧道模式不支持跨网段真实服务器要求anyTunneling支持网络private(私网)LAN/WAN(私网/公网)LAN(私网)真实服务器数量High (100)High (100)真实服务器网关lvs内网地址。
文章浏览阅读899次。https://www.toutiao.com/a6713171323893318151/作者 | 黄小邪/言有三编辑 | 黄小邪/言有三图像预处理算法的好坏直接关系到后续图像处理的效果,如图像分割、目标识别、边缘提取等,为了获取高质量的数字图像,很多时候都需要对图像进行降噪处理,尽可能的保持原始信息完整性(即主要特征)的同时,又能够去除信号中无用的信息。并且,降噪还引出了一..._噪声很大的图片可以降噪吗
文章浏览阅读152次。目录谨慎地覆盖cloneCloneable接口并没有包含任何方法,那么它到底有什么作用呢?Object类中的clone()方法如何重写好一个clone()方法1.对于数组类型我可以采用clone()方法的递归2.如果对象是非数组,建议提供拷贝构造器(copy constructor)或者拷贝工厂(copy factory)3.如果为线程安全的类重写clone()方法4.如果为需要被继承的类重写clone()方法总结谨慎地覆盖cloneCloneable接口地目的是作为对象的一个mixin接口(详见第20_为继承设计类有两种选择,但无论选择其中的
文章浏览阅读958次,点赞21次,收藏24次。今天学长向大家分享一个毕业设计项目基于协同过滤的电影推荐系统项目运行效果:项目获取:https://gitee.com/assistant-a/project-sharing21世纪是信息化时代,随着信息技术和网络技术的发展,信息化已经渗透到人们日常生活的各个方面,人们可以随时随地浏览到海量信息,但是这些大量信息千差万别,需要费事费力的筛选、甄别自己喜欢或者感兴趣的数据。对网络电影服务来说,需要用到优秀的协同过滤推荐功能去辅助整个系统。系统基于Python技术,使用UML建模,采用Django框架组合进行设
文章浏览阅读614次。10G SFP+光模块被广泛应用于10G以太网中,在下一代移动网络、固定接入网、城域网、以及数据中心等领域非常常见。下面易天光通信(ETU-LINK)就为大家一一盘点下10G SFP+光模块都有哪些吧。一、10G SFP+双纤光模块10G SFP+双纤光模块是一种常规的光模块,有两个LC光纤接口,传输距离最远可达100公里,常用的10G SFP+双纤光模块有10G SFP+ SR、10G SFP+ LR,其中10G SFP+ SR的传输距离为300米,10G SFP+ LR的传输距离为10公里。_10g sfp+
文章浏览阅读239次。该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流项目运行环境配置:项目技术:Express框架 + Node.js+ Vue 等等组成,B/S模式 +Vscode管理+前后端分离等等。环境需要1.运行环境:最好是Nodejs最新版,我们在这个版本上开发的。其他版本理论上也可以。2.开发环境:Vscode或HbuilderX都可以。推荐HbuilderX;3.mysql环境:建议是用5.7版本均可4.硬件环境:windows 7/8/10 1G内存以上;_基于vue美食网站源码
文章浏览阅读62次。oldwain随便写@hexun链接:http://oldwain.blog.hexun.com/ ...
文章浏览阅读843次,点赞16次,收藏22次。用这个工具扫描其它网站时,要注意法律问题,同时也比较慢,所以我们以之前写的登录页面为例子扫描。_sqlmap拖库
文章浏览阅读1.5w次,点赞5次,收藏38次。Origin也能玩转图片的拼接组合排版谭编(华南师范大学学报编辑部,广州 510631)通常,我们利用Origin软件能非常快捷地绘制出一张单独的绘图。但是,我们在论文的撰写过程中,经常需要将多种科学实验图片(电镜图、示意图、曲线图等)组合在一张图片中。大多数人都是采用PPT、Adobe Illustrator、CorelDraw等软件对多种不同类型的图进行拼接的。那么,利用Origin软件能否实..._origin怎么把三个图做到一张图上
文章浏览阅读4.2k次,点赞4次,收藏51次。51单片机智能电风扇控制系统仿真设计( proteus仿真+程序+原理图+报告+讲解视频)仿真图proteus7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0042。_电风扇模拟控制系统设计