首页 > 嵌入式软件 > QT

 

本文引用地址: http://www.21ic.com/embed/software/qt/201703/45056.html

一、前言

  前面我们了解了关于Qt字符串的一些简单操作,容器类的分类和各自的主要特点以及用途,这一次我们了解一些常见的工具类和常见的控件。

二、QByteArry和QVariant

2.1  QByteArry

 关于QByteArry,我们在上篇中曾经看到过。QByteArry和QString的功能和API基本类似,具有很多相似的函数。不同的地方在于QByteArry能够存储原生的二进制数据和8位编码的文本数据,那么何为原生的二进制数据和8为编码的文本数据呢?稍微了解计算机原理的童鞋可能都知道,计算机内部所有的数据都是以0和1的形式进行存储的,这种存储形式就是二进制。对于这些二进制代码,计算机并不知道其具体的含义,需要通过上下文进行决定。对于文件而言,即使是一个文本文件,读出时也可以按照二进制的形式读出,这就是二进制格式。如果把这些二进制中的0和1按照编码解释成一个个的字符,就可以构成一个文本了。因此,QByteArry实际上楇原生的二进制,也可以看作是文本,具有文本的一些操作。但是对于文本字符流的操作,还是建议使用QString而不是QByteArry,因为QString支持Unicode。

  出于方便,QByteArry自动的保证最后一个字节之后的那位的值是“”,这样也导致QByteArry可以容易的转变为const char*,同样作为存储二进制的数据类型,QByteArry中间也可以存储“”。

2.2 QVariant

  有时候我们希望将不同类型的数据存储在一个变量中,如果是在Java中可以通过Object类型的变量实现,但是C++中没有这种公有继承的类。Qt通过声明一个类,这个类包含所有需要存储的数据类型,这就是QVariant类。

  QVariant类可以保存很多Qt的数据类型,包括QBrush、QColor、QCursor、QDataTime、QFont、QKeySequence、QPalette、QPen、QPixmap、QPoint、QRect、QRegion、QSize和QString,并且还包括基本类型,int、float等等。

  Qvariant还可以保存很多的集合类型,如QMap<QString,QVariant>,QStringList和QList<QVariant>。其中item view classes,数据库模块和QSettings都大量使用了QVariant类,方便读写数据。

  QVariant支持嵌套存储。

复制代码
 1 QMap<QString,QVariant>map;  2 map["int"]=123;  3 map["double"]=1.23;  4 map["string"]="123";  5 map["color"]=QColor(255,0,0);  6 qDebug()<<map["int"]<<map["int"].toInt();  7 qDebug()<<map["double"]<<map["double"].toDouble();  8 qDebug()<<map["string"]<<map["string"].toString();  9 //使用value<T>()模版函数,获取存储在QVariant中的数据
10 qDebug()<<map["color"]<<map["color"].value<QColro>();
复制代码

  我们也可以自定义QVariant,被QVariant存储的数据类型必须有一个默认的构造函数和一个拷贝构造函数,同时首先必须使用Q_DECLARE_METATYPE()宏。通常会将这个宏放在类的声明所在头文件的下面。

      

1 Q_DECLARE_METATYPE(human) 
复制代码
1 human humen ;   2 QVariant variant = QVariant::fromValue(humen );   3 // ...  
4 if (variant.canConvert<human >()) {   5     human h= variant.value<human>();   6     // ...  
7 } 
复制代码

三、算法及正则表达式

3.1 Qt5常用算法

  常用算法在Qt的<QtAlgorithm>和<QtGlobal>模块中。

复制代码
 1 #include <QCoreApplication>
 2 #include <QString>
 3 #include <QtDebug>
 4 int main(int argc, char *argv[])  5 {  6     QCoreApplication app(argc, argv);  7     double a=-19.35,b=5.6;  8     double c=qAbs(a); //取绝对值
 9     double max=qMax(b,c); //取最大值
10 
11     int bi=qRound(b);  //取整
12     int ci=qRound(c); 13 
14 
15     qDebug()<<"a="<<a; 16     qDebug()<<"b="<<b; 17     qDebug()<<"c=qAbs(a)= "<<c; 18     qDebug()<<"qMax(b,c)= "<<max; 19     qDebug()<<"bi=qRound(b)= "<<bi; 20     qDebug()<<"ci=qRound(c)= "<<ci; 21 
22 
23     qSwap(bi,ci);     //交换值 24     qDebug()<<"qSwap(bi,ci): "<<"bi= "<<bi<<"ci= "<<ci; 25 
26     return app.exec(); 27 }
复制代码

 

3.2 基本的正则表达式

  Qt的QRegExp类是正则表达式的表示类,它基于Perl的正则表达式语言,完全支持Unicode,可以方便的完成处理字符串的一些操作,如验证、查找、替换和分割等。

  正则表达式有表达式(expressions)、量词(quantifiers)和断言(assertions)组成。

  (1)最简单的表达式是一个字符。比如我想要表示字符集的表达式可以使用[AEIOU]表示匹配所有的大些的原因字母;使用[^AEIOU]表示匹配所有的非元音字母;连续的字符集可是使用表达式[a-z],表示匹配所有的小写字母。

  (2)量词说明表达式出现的次数,如“x[1,2]”表示x至少有一个,最多有两个。

  在计算机语言中,标识符通常要求以字母或下划线开头,后面可以是字母、数字和下划线。比如“[A-Za-z_]+[A-Za-z_0-9]*”

  +表示[A-Za-z_]至少出现一次,可以出现多次

  *表示[A-Za-z_0-9]可以出现零次或者多次

正则表达式的量词

 

量词 含义 量词 含义
E? 匹配0次或1次 E[n,] 至少匹配n次
E+ 匹配1次或多次 E[,m] 最多匹配m次
E* 匹配0次或多次 E[n,m] 至少匹配n次,最多匹配m次
E[n] 匹配n次    

正则表达式的字符集

 

对象 意义
C 单个字符标识其本身,除非它在正则表达式中有特殊意义
c 特殊字符本身
a 匹配ASCII bell(BEL,0x07)
f 匹配ASCII form feed(FF,0x0C)
n 匹配ASCII 行(LF,0x0A,Unix newline)
r 匹配ASCII 回车(CR,0x0D)
t 匹配ASCII  水平tab键(HT,0x09)
v 匹配ASCII 竖直tab键(VT,0x0B)
xhhhh 匹配Unicode字符十六进制数hhhh(0x0000 -0xFFFF)
ooo 匹配八进制数ooo(0-0377)
. 匹配任意字符(包括newline)
d 匹配数字(Qchar::isDiagit())
D 匹配非数字
s 匹配空格字符(Qchar::isSpace())
S 匹配非空格字符
w 匹配单词字符(Qchar::isLetterOrNumber(),Qchar::isMark(),或者’_’)
W 匹配非单词字符
n 匹配第几个backreference 例如1,2

 

  (3)“^” "$" "b"都是正则表达式的断言

正则表达式的断言

 

符号 含义 符号 含义
^ 表示在字符串开头进行匹配 B 非单词边界
$ 表示在字符串结尾进行匹配 (?=E) 表示表达式后紧随E才匹配
b 单词边界 (?!E) 表示表达式后不紧随E才匹配

  举例说明,如果只有在using后面是namespace时才匹配using,则可以使用"using(?=Es+namespace)" (此处“?=E”后面的“s”表示匹配一个空白字符)。

  如果使用“using(?!Es+namespace)”,则表达式只有在using 后面不是namespace时才匹配using。

  如果使用“usings+namespace”,则匹配为using namespace。

  C++编译器转义反斜杠,在正则表达式中包含,需要写成\,若要匹配反斜杠字符本身,键入四次\\。

no pains ,no gains. 给自己加油,为未来奋斗。
换一批

延伸阅读

[行业资讯] Qt5.3重磅登场:增强跨平台性与全新收费模式

Qt5.3重磅登场:增强跨平台性与全新收费模式

移动设备操作系统种类的不断增加,开发者在开发应用的时候需要针对不同的平台分别开发APP,这既增加了开发者投入的成本,又延缓了APP上架的时间。但是,开发者热衷于多个平......

关键字: Qt5.3 Digia Qt开发者大会

[新鲜事] 太淘气了!俄罗斯机器人两次私自逃离实验室将被拆解

太淘气了!俄罗斯机器人两次私自逃离实验室将被拆解

在威尔史密斯的电影《机械公敌》中,一个人工智能机器人因为有了自己的思想,在人类社会中造成了极大的混乱,如今机器人拥有智能这一现象在俄罗斯真实上演了,这个机器人两度私自逃出了实验室,第一次因为电量耗完被搁置在马路中间,第二次逃走未遂,实验室准......

关键字:俄罗斯 机器人 人工智能

[真心话] 身价816亿美元!扎克伯格有望超越巴菲特成全球第三富

身价816亿美元!扎克伯格有望超越巴菲特成全球第三富

Facebook股价今日升至202美元的历史新高。这让Facebook创始人扎克伯格的身价达到了816亿美元,有望成为全球第三富有的人。目前,扎克伯格的身价与巴菲特之间的差距已缩小至2900万美元。Facebook创始人扎克伯格身价周......

关键字:扎克伯格 巴菲特

[真心话] 电子工程师安身立命的八大看家本领,你学会了几个?

电子工程师安身立命的八大看家本领,你学会了几个?

作为一个电子工程师(electronic engineer)必备技能:抄板,焊板,画板,仿真,编程,调试,创意,坚持。八大技能,你几级了?......

关键字:电子工程师

[新鲜事] 世界卫生组织将“游戏成瘾”列入精神疾病,任天堂索尼激烈反对...

世界卫生组织将“游戏成瘾”列入精神疾病,任天堂索尼激烈反对...

北京时间6月20日早间消息,美国娱乐软件协会(ESA)就世界卫生组织将“游戏成瘾”列入精神疾病的做法提出激烈批评,认为他们列举的证据不够充分,而且可能引发误诊。ESA呼吁世界卫生组织在将游戏成瘾正式列入......

关键字:游戏 任天堂 索尼

[真心话] 三大运营商取消流量漫游费,本地流量将被国内流量替代

三大运营商取消流量漫游费,本地流量将被国内流量替代

7月1日,中国移动、中国联通和中国电信正式全面取消流量漫游费,原有套餐中的省内通用流量直接升级为国内流量,但并不包含港澳台地区。目前原来的本地流量已经转化为国内流量。对于本地流量转化为国内流量后价格是否......

关键字:电信 网络流量
条评论

我 要 评 论

网友评论

大家都爱看

  • 扇出型晶圆级封装的优势和挑战!

    我们有能力创造一些能保持前代性能并且更好更小的电子设备,例如今天的可穿戴设备、智能手机或平板电脑,这是由于很多因素超过摩尔定律而快速发展,从而能够从底层的嵌入组件发展到今天把它们封…

    2018-03-29
  • Xilinx推出革命性的新型自适应计算产品

    自适应和智能计算的全球领先企业赛灵思公司(Xilinx, Inc.,(NASDAQ:XLNX)),近日宣布推出一款超越FPGA功能的突破性新型产品,名为ACAP(Adaptive Compute Acceleration Platform,自适应计算加速…

    2018-03-20
  • 赛普拉斯为树莓派3 B+ IoT单板计算机提供强大稳定的无

    先进嵌入式系统解决方案的领导者赛普拉斯(纳斯达克代码:CY)近日宣布其Wi-Fi&#174;和蓝牙&#174;combo解决方案为全新的树莓派 3 B+(Raspberry Pi 3Model B+)IoT单板计算机提供强大稳定的无线连接…

    2018-03-20
  • 观看直播领红包,SEED-A10加速卡助力人工智能

    随着云服务器、云计算的发展,大家对硬件加速的需求越来越多,但是随着设备功耗的上升、性能需求越来越高,常规加速设备以及开始不能满足需求,因此FPGA逐渐在硬件加速中找到了自己的位置,而艾…

    2018-03-19
  • 特朗普:博通不得以任何形式收购高通

    白宫周一(3月12日)晚发出声明,川普(特朗普)总统出于“国家安全”考量、禁止新加坡博通公司(Broadcom)收购美国高通公司(Qualcomm)。

    2018-03-14