我的QT5学习之路(三)——模板库、工具类和控件(中)
2015-11-18 20:02
363 查看
一、前言
前面我们了解了关于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支持嵌套存储。
QMap<QString,QVariant>map; map["int"]=123; map["double"]=1.23; map["string"]="123"; map["color"]=QColor(255,0,0); qDebug()<<map["int"]<<map["int"].toInt(); qDebug()<<map["double"]<<map["double"].toDouble(); qDebug()<<map["string"]<<map["string"].toString(); //使用value<T>()模版函数,获取存储在QVariant中的数据 qDebug()<<map["color"]<<map["color"].value<QColro>();
我们也可以自定义QVariant,被QVariant存储的数据类型必须有一个默认的构造函数和一个拷贝构造函数,同时首先必须使用Q_DECLARE_METATYPE()宏。通常会将这个宏放在类的声明所在头文件的下面。
Q_DECLARE_METATYPE(human)
human humen ; QVariant variant = QVariant::fromValue(humen ); // ... if (variant.canConvert<human >()) { human h= variant.value<human>(); // ... }
三、算法及正则表达式
3.1 Qt5常用算法
常用算法在Qt的<QtAlgorithm>和<QtGlobal>模块中。#include <QCoreApplication> #include <QString> #include <QtDebug> int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); double a=-19.35,b=5.6; double c=qAbs(a); //取绝对值 double max=qMax(b,c); //取最大值 int bi=qRound(b); //取整 int ci=qRound(c); qDebug()<<"a="<<a; qDebug()<<"b="<<b; qDebug()<<"c=qAbs(a)= "<<c; qDebug()<<"qMax(b,c)= "<<max; qDebug()<<"bi=qRound(b)= "<<bi; qDebug()<<"ci=qRound(c)= "<<ci; qSwap(bi,ci); //交换值 qDebug()<<"qSwap(bi,ci): "<<"bi= "<<bi<<"ci= "<<ci; return app.exec(); }
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次 |
对象 | 意义 |
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 |
正则表达式的断言
符号 | 含义 | 符号 | 含义 |
^ | 表示在字符串开头进行匹配 | \B | 非单词边界 |
$ | 表示在字符串结尾进行匹配 | (?=E) | 表示表达式后紧随E才匹配 |
\b | 单词边界 | (?!E) | 表示表达式后不紧随E才匹配 |
如果使用“using(?!E\s+namespace)”,则表达式只有在using 后面不是namespace时才匹配using。
如果使用“using\s+namespace”,则匹配为using namespace。
C++编译器转义反斜杠,在正则表达式中包含\,需要写成\\,若要匹配反斜杠字符本身,键入四次\\\\。
正则的知识还是挺多的,因为自己还没有真正用过Qt的正则,这里先挖一个坑,以后有很好的例子的时候再补上来,嘿嘿。这里给一个不错的总结博客,希望能够帮到你。点击这里,跳转......
相关文章推荐
- 命令行执行Qt程序
- 命令行执行Qt程序
- Qt程序启动画面播放(gif与swf两种动画格式) - 路上的脚印
- QTCreator项目转移到VS项目步骤、中文乱码解决方案
- 老李分享:qtp自动化测试框架赏析-关键字自动化测试框架(二)
- QT QTableWidget 用法总结
- ubuntu 下在应用程序列表中创建QTCREATOR快捷图标
- Qt---在QLabel上实现系统时间
- Ⅰ.2.6.6 如何测试Graphics Views、Graphics Scenes 和 Graphics Items (Qt 4)
- Ⅰ.2.6.5 如何测试QAction、QMenu、以及QMenuBar(Qt 4)
- Qt ini配置文件读写
- Qt的进度条设置
- 在Ubuntu 10.04中文版下Qt编程,使用unixODBC和FreeTDS连接MS SQL Server 2005,并且中文不出现乱码的方法
- QT中在全盘中寻找特定的文件
- QT在VS2010下的使用配置
- Ⅰ.2.6.4 如何测试 Table Widgets,以及使用外部数据文件(Qt 4)
- Qt和WPF比较---控件布局和消息响应
- 用Qt写的一个仿Windows记事本程序
- QT生成PDF文件
- qt处理浏览器问题