关闭
关闭
首页 > 嵌入式软件 > QT
 本文引用地址: http://embed.21ic.com/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自动的保证最后一个字节之后的那位的值是“\0”,这样也导致QByteArry可以容易的转变为const char*,同样作为存储二进制的数据类型,QByteArry中间也可以存储“\0”。

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)
\0ooo 匹配八进制数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(?=E\s+namespace)" (此处“?=E”后面的“\s”表示匹配一个空白字符)。   如果使用“using(?!E\s+namespace)”,则表达式只有在using 后面不是namespace时才匹配using。   如果使用“using\s+namespace”,则匹配为using namespace。   C++编译器转义反斜杠,在正则表达式中包含\,需要写成\\,若要匹配反斜杠字符本身,键入四次\\\\。
no pains ,no gains. 给自己加油,为未来奋斗。
换一批

延伸乐虎国际娱乐手机版

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

Qt5.3重磅登场:增强跨平台性与全新收费模式移动设备操作系统种类的不断增加,开发者在开发应用的时候需要针对不同的平台分别开发APP,这既增加了开发者投入的成本,又延缓了APP上架的时间。但是,开发者热衷于多个平......关键字: Qt5.3 Digia Qt开发者大会

[新鲜事] 海底发现稀有金属碲:绿色能源创造和开采破坏之间该如何权衡

海底发现稀有金属碲:绿色能源创造和开采破坏之间该如何权衡 碲的发现引发两难困境:一方面这是创造大量绿色能源所必需的资源,但另一方面这些资源的开采可能会对环境造成极大的危害。......关键字:金属碲 环境保护

[新鲜事] 库班称全球首位万亿富豪将来自人工智能领域

库班称全球首位万亿富豪将来自人工智能领域据外电报道,参加2016年西南偏南(SXSW)大会的 NBA 球队达拉斯小牛队的老板、科技产业亿万富豪马克·库班(Mark Cuban)周一表示,全球首位万亿富豪将来自人工智能领域。......关键字:万亿富豪 人工智能

[疯狂史] 从硬件工程师转到纯软件开发,回顾那些岁月

从硬件工程师转到纯软件开发,回顾那些岁月本篇文章,我会详细地讲述我如何从一个硬件工程师转到Java Web软件开发的,希望给需要的人做一个参考。或者,你就当故事看看也可以。......关键字:硬件工程师 软件开发

[新鲜事] 特斯拉最新固件为配备HW2硬件车型启动更多自动辅助驾驶功能

特斯拉最新固件为配备HW2硬件车型启动更多自动辅助驾驶功能去年10月份,特斯拉为新款在产所有车型都配备了第二代自动驾驶模块硬件Autopilot Hardware2(简称 HW2),其将赋予汽车完整的自主驾驶功,从根本上提高车辆行驶的安全性。现在,特斯拉通过最新的空中更新向配备HW2硬件的车型更新......关键字:特斯拉 自动驾驶

[新鲜事] “摩尔定律”接近物理极限 未来属于光子芯片?

“摩尔定律”接近物理极限 未来属于光子芯片? “预计芯片中集成晶体管的数量 24 个月会提高一倍。”——相信大家对英特尔联合创始人戈登摩尔提出的“摩尔定律”并不陌生。在过去的四十年里,IT 行业一直受这一定律的驱动。不过近年来随着传统电子芯片发展速度的放缓,“摩尔定律”正逐渐走向历史......关键字:摩尔定律 光子芯片
条评论

我 要 评 论

网友评论

大家都爱看

  • 华为的优势,就是自家的各种自研芯片

    CPU即中央处理器,是一块超大规模的集成电路,是一台计算机的运算核心和控制核心。它的功能主要是解释计算机指令以及处理计算机软件中的数据。
    2017-08-16
  • 你不知道Ryzen芯片有多火?来看看AMD的股票吧

    据外媒报道,美银美林认为,AMD最新的Ryzen芯片可能会引发一波销售浪潮,进而推动该股继续上涨。它认为AMD股票还有40%以上的上涨空间。

    2017-08-16
  • 国产芯片:厚积薄发,强势崛起

    关于国产芯片,是近几年才有崛起的势头,可是在几年之前,国产芯片还处于“沉睡”的状态,尤其是手机芯片,几乎大部分都依赖进口,而且国外的市场几乎被高通和联发科所垄断,也就展讯还在市场边… 2017-08-16
  • 为了数据安全 大疆无人机增加隐私飞行功能

    大疆周一表示,在美国陆军因为“网络缺陷”而要求其成员停用大疆无人机后,这家中国无人机制造商将加强无人机的数据安全性。 大疆政策和法务副总裁布伦丹&middot… 2017-08-15
  • Intel代工 展讯发布14nm SC9853I手机SoC

    SC9853I采用的Intel的14nm FinFET制程,架构为8核64位Airmont架构,主频1.8GHz,GPU为Mali-T820 MP2,号称面向799~1299元档次的手机。… 2017-08-15