技术标签: 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数据类型和有用的数据操作类总结。
文章浏览阅读781次。【系分范文】系分论文模板_系分文档
文章浏览阅读275次,点赞8次,收藏2次。版本说明:Ubuntu-e 指定容器内的环境变量,single-node单机模式-v 挂载目录,冒号前面的宿主机目录,冒号后面是容器内的目录,--name 容器的名字是es使用apipost访问,或者浏览器输入网址出现“You know,For search”说明安装成功安装分词器1.在线下载2.手动添加最后检查一下是否安装成功。
文章浏览阅读694次。这个平台登录完之后就这样了,然后说是发了一份邮件,但是邮件内容里面没有任何类似确认账号的信息或者按钮,怎么才能找回账号呢,各位兄弟姐妹有没有遇到过,怎么处理呢?_sms-activate 提示我的账号不受保护,不知道原因
文章浏览阅读1.6k次。select userid,count(id) num,count(case WHEN type =0 then 0 end),count(case WHEN type=1 then 1 end) from tbwhereis_delete=0GROUP BY useridselect userid,count(id) num,count(case type WHEN 0 then 0 end),count(case type WHEN 1 then 1 end) from tbwher._mysql case when分组
文章浏览阅读936次。LSTM是RNN的一种。它的出现解决了梯度失真的问题。而且使得RNN的收敛速度比普通的RNN要快上不少。LSTM的名称有些奇特,叫长短时记忆。这个实际反应了这个算法的原理:保持记忆的长短。我们的大脑并不是记忆所有的信息,有短时记忆,也有长时间记忆。LSTM就是利用这个原理来设计的。普通的RNN只是保持了短时的记忆(h),在LSTM中增加了对记忆的处理。这个增加的部分控制的逻辑比较复杂。简单的来说就是通过3个门:遗忘门、输入门和输出门来控制增加的记忆单元。需要注意的是,增加的门都是用来控制记忆单元的。_lstm的定义
文章浏览阅读4.7k次。1. 计算机工程与应用: 评审费为100元,评审期为60-70天左右,布局费为930-1100元. 该杂志为期十年,从雇用到出版大约需要12个月. 有时这取决于运气. 如果幸运的话,大约四个月. 最大的特点是该期刊载有大量论文,相对来说比较好,但每个人都看中此功能,所以就论文数量而言,一定要有创新性,并且要更加重视博士论文. 论文. 可以加快发布速度,但是成本更高. 摘要: 简单.2. 计算机工程..._计算机科学审稿
文章浏览阅读889次,点赞22次,收藏18次。在CSS3中,animation属性用于实现元素的动画。animation属性跟transition属性在功能实现上是非常相似的,都是通过改变元素的属性值来实现动画效果。但是,这两者实际上有着本质的区别。CSS3中的animation属性就是为了解决这些问题而提出的。animation属性可以通过控制关键帧来控制动画的每一步,从而实现更为复杂的动画效果。使用animation属性实现CSS3动画需要两步。_css3 动画细说
文章浏览阅读226次。原文:Concentration Gradients什么是浓度梯度?溶液中化学物质的浓度指单位体积溶液中有多少这种分子。梯度用来测量某量随地点而变的变化程度。浓度梯度当然就表示浓度随地点而变的变化程度。现在我们举几个例子。我们把单个分子画成小蓝点。如果分子浓度均匀,即没有梯度,溶液就如下图所示:没有浓度梯度的溶液下面再看个浓度有梯度的溶液,如下图所示,右边浓度高,左边浓度低:有浓度..._浓度扩散 随机行走
文章浏览阅读191次。《本科《C语言程序设计A》历年考题汇总》由会员分享,可在线阅读,更多相关《本科《C语言程序设计A》历年考题汇总(7页珍藏版)》请在人人文库网上搜索。1、第一套(2010年7月试题)一、单选题(每小题2分,共20分)1在每个C语言程序中都必须包含有这样一个函数,该函数的函数名为(A)。A. main B. MAIN C. name D. function2每个C语言程序文件的编译错误分为(B)类。A..._c语言程序设计本科考试题
文章浏览阅读1.2k次,点赞2次,收藏3次。这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Ma..._mac 安装配置sublime text
文章浏览阅读69次。finreport JS千分位
文章浏览阅读660次。poj2488题解题意骑士(类似于中国象棋里的马)从任意起点出发,遍历n*m的棋盘上的每一个格子,在任意终点结束,输出最小字典序遍历道路。笺释按照字典序遍历起点,然后进入dfs搜索。 按照下列1-8的顺序移动就是最小字典序int movm[9]={0,-2,-2,-1,-1,1,1,2,2};int movn[9]={0,-1,1,-2,2,-2,2,-1,1};也就是按照向左上,左下,右上,右_poj2488