六、QVariant类与常用算法及正则表达式
6.1 QVariant类
QVariant类本质为c++联合(Union)数据类型,它可以保存很多Qt类型的值,包括QBrush、QColor、QString等等。也能够存放Qt的容器类型的值。
由于很多功能和前面的类相似,就不再赘述。
实例
#include<QVariant>
#include<QDebug>
struct student
{
int no;
QString name;
int score;
};
Q_DECLARE_METATYPE(student)
QVariant v1=123;
qDebug()<<v1.toInt();
QVariant v2="string";
qDebug()<<v2.toString();
QMap<QString,QVariant> v3;
v3["int"]=234;
v3["double"]=1.1;
v3["string"]="zhangsan";
qDebug()<<v3;
QStringList st;
st<<"a"<<"b"<<"c"<<"d";
QVariant v4=st;
if(v4.type()==QVariant::StringList)
{
QStringList list=v4.toStringList();
for(int i=0;i<list.size();i++)
{
qDebug()<<list.at(i);
}
}
student stu;
stu.no=1;
stu.name="zhangsan";
stu.score=100;
QVariant v5=QVariant::fromValue(stu);
if(v5.canConvert<student>())
{
student st1=v5.value<student>();
student st2=qvariant_cast<student>(v5);
qDebug()<<st1.no<<' '<<st1.name<<' '<<st1.score;
qDebug()<<st2.no<<' '<<st2.name<<' '<<st2.score;
}
//输出结果
123
"string"
QMap(("double", QVariant(double, 1.1))("int", QVariant(int, 234))("string", QVariant(QString, "zhangsan")))
"a"
"b"
"c"
"d"
1 "zhangsan" 100
1 "zhangsan" 100
Q_DECLARE_METATYPE(Type)
这个宏是为了让QMetaType知道Type这个数据类型,并提供一个默认的拷贝构造函数和析构函数。QVariant需要使用Q_DECLARE_METATYPE这个宏来定制类型。
QVariant::type()函数返回存储在QVariant变量中的值的数据类型。QVariant::StringList是Qt定义的一个QVariant::type枚举类型的变量。
同时QVariant还可以存储结构体。
QVariant::fromValue()函数用于将任何类型的值转换为QVariant类型。
canConvert()函数返回bool类型,返回QVariant进行两个类型之间的转换能力,重点是类型。
还有一个函数是convert(),是返回QVariant进行两个类型的数据之间转换的能力,重点是数据。
QVariant::value()与qvariant_cast<T>()
qvariant_cast<T>(const QVariant &value)
把value转化为T,这个函数等同于QVariant::value()
6.2 常用算法
1. double qAbs(a):数qAbs()返回double类型数值a的绝对值
2. double qMax():函数qMax()返回两个数值中的最大值
3. int qRound(b):返回一个与浮点数最接近的整数值(四舍五入)
4. int qSwap(a,b):交换两数的值
以上算法就不一一实现了,相信大家都写过。
6.3 正则表达式
正则表达式,又称规则表达式,(Regular Expression,在代码中常简写为regex、regexp或RE),是一种文本模式,包括普通字符(例如,a到z之间字母)和特殊字符(称为“元字符”)。正则表达式使用单个字符串来描述、匹配一系列匹配某个语法规则的字符串,通常被用来检索】替换那些符合某个模式的文本。正则表达式描述一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
正则表达式由表达式(expressions)、量词(quantifiers)、断言(assertions)组成。
1. 最简单的表达式是一个字符。字符集可以使用表达式如"[AEIOU]",表示匹配所有的大写元音字母;使用"[^AEIOU]",表示匹配所有非元音字母,即辅音字母;连续的字符集可以使用表达式如"[a-z]",表示匹配所有的小写英文字母。
2. 量词说明表达式出现的次数,如"x[1,2]"表示'x'可以至少有一个,至多有两个。
量词 | 含义 | 量词 | 含义 |
---|---|---|---|
E? | 匹配0次或1次 | E[n,] | 至少匹配n次 |
E+ | 匹配1次或多次 | E[,m] | 最多匹配m次 |
E* | 匹配0次或多次 | E[n,m] | 至少匹配n次,最多匹配m次 |
E[n] | 匹配n次 |
符号 | 含义 | 符号 | 含义 |
---|---|---|---|
^ | 表示在字符串开头进行匹配 | \B | 非单词边界 |
$ | 表示在字符串结尾进行匹配 | (?=E) | 表示表达式后紧随E才匹配 |
\b | 单词边界 | (?!E) | 表示表达式后不跟随E才匹配 |