1、 QVariant 类用于封装数据成员的类型及取值等信息,该类类似于 C++ 共用体 union ,一个QVariant 对象,一次只能保存一个单一类型的值。该类封装了 Qt 中常用的类型,对于 QVariant 不支持的类型 ( 比如用户自定义类型 ) ,则需要 使 用 Q_DECLARE_METATYPE( Type )宏进行注册。! A, [. M7 G; \: k, d
2、QVariant 拥有常用类型的单形参构造函数,因此可把这些常用类型转换为 QVariant 类型,同时 QVariant 还重载了赋值运算符,因此可把常用类型的值直接赋给 QVariant 对象。注:由 C++语法可知,单形参构造函数可进行类型转换。: Y; n: p+ c* A
3、使用 QVariant 构造函数和赋值运算符。& W j' v# F6 o& {
注意: QVariant 没有 char 类型的构造函数,若使用 char 值会被转换为对应的 int 型。
. ?$ @# f: a2 p" M+ S1 lQVariant v(1); // 调用 QVariant(int) 构造函数创建一个 QVariant 类型的对象,并把数值 1 保存到 v 中。0 Q0 ~( A/ ]' D
v=2; // 调用 QVariant 的赋值运算符,把值 2 保存在 v 之中,因为 QVariant 是类似于共用体的类, 因此同一时间只会保存一个值。
$ F- I! y4 Z$ p0 d' `" _/ N! {4 [0 R9 m! b/ u1 Z
4、 获取 QVariant 对象存储的值的类型,可使用如下函数:
, U$ D, P2 D/ O0 `Type type() const
1 g/ G1 D: Q. l4 R" _7 C% x \3 D获取 QVariant 对象当前存储值的类型,类型以枚举 QMetaType::Type 的形式表示
& h$ N& }6 ~" e; u! v0 a- p
/ [* e9 R5 G$ _) [( `* Z# Lconst char * typeName() const;9 ?5 t, |* W# c1 B6 l' y2 g" `
以字符串的形式返回 QVariant 对象存储的值的类型。若是无效类型则返回 0 。& \0 K- c3 K N- t4 }: F, l
const char* typeToName(int t);) v1 o1 {. r3 B# c; x" C
把以枚举类型 QMetaType::Type 表示的类型以字符串的形式返回。若枚举值QMetaType::* t, y* J! G+ i ^8 G( X: w
UnknownType 或不存在,则返回一个空指针。
! W7 x7 p4 S1 m1 y8 T+ ?) T2 O: M+ X: a& E% {
示例:. n" S8 I/ a2 I4 R5 s4 m) b, V
- * S) d& J- P' b6 M7 @0 X, v
0 t B5 L' ]2 X2 y% \
QVariant v(1);; V! \1 R, U! u: O: g: ~
/ ?1 z4 r% c* r- p$ I
: r' H1 I) G( k( V5 h: p+ H; |$ X, Q8 C+ Z
cout<<v.typeName()<<endl; //输出 int
: H3 i% F* _! a! k
7 Z% L/ }3 O+ _* d8 j) x- 6 c) c8 b! F6 r
: i( f# L3 I Y# ^. q# y8 ?! m
cout<<v.typeToName(v.type())<<endl; //输出 int
/ i* w' n4 P3 Z8 p; W6 u m7 b1 Q( ]8 _+ \
) G4 v4 b$ C2 D0 ^) P
% n9 v5 N4 `( {; D) V
5、获取和设置 QVariant 对象存储的值,可使用如下函数: void setValue(const T& v); 把一个值的副本存储到 QVariant 对象中,若类型 T 是 QVariant 不支持的类型,则使用 QMetaType 来存储该值,若 QMetaType 也不能处理,则发生编译错误。注:若是用户 自定义类型则需要使用宏 Q_DECLARE_METATYPE(…) 进行注册 T value() const; 把存储的值转换为类型 T 并返回转换后的值,存储值本身不会被改变。若 T 是 QVariant 支持的类型,则该函数与 toInt 、 toString 等函数功能完全相同。注:使用该函数时需要使用尖括号指定 T 的类型,比如 xx.value<int>(); T toT() 其中 T 是某一类型,比如若 T 是 int ,则该函数形式就为 int toInt() 。 该函数用于把存储的值转换为类型 T 并返回转换后的值,存储值本身不会被改变。 其中比较常用的是 toString 函数,该函数可把存储的值转换为 QString 形式,这样 便可以字符串的形式输出存储的值。 注意:没有与自定义类型相对应的 toT 函数,比如 class C{}; 则没有 toC 函数,要 把存储的值转换为自定义类型,需要使用 value 函数,且还需对自定义类型注册。 6、 注意:QVariant 中的枚举类型 Type 已被废弃。 9 J w1 i5 y: R/ _% J( L2 Z; V3 R
7、使用 QVariant 的默认构造函数,将创建一个无效的 QVariant 对象(或空的 QVariant 对象), 可通过 isNull()成员函数进行判断。
a, H+ I0 a/ f1 U2 q* M! g! t1 nQVariant v('a'); /*QVariant 没有专门的 char 构造函数,此处的字符 a 会被转换为 int 型,因此 v 中存储的是数值 97,而不是字符 a 。*/ m3 Z% x* z. U; d5 |9 s
cout<<v.value<int>()<<endl; //输出 97
$ S& W4 m Y. ?* {! |6 ?cout<<v.value<char>()<<endl; //输出 a,将 97 转换为 char 型,并输出转换后的值。 2 {) }) P, ^$ g5 F# O2 |) J
cout<<v.toChar().toLatin1()<<endl; /*输出 a,原因同上,注意 toChar 返回的类型是 QChar 而不 是 char。*/
: s3 _7 K% f+ E* Kcout<<v.toString().toStdString()<<endl; /*输出 97,把存储在 v 中的值转换为 QString,然后以字 符串形式输出。*/ ' b5 ? u2 }3 [* C4 N& d
cout<<v.typeName()<<endl; //输出 int,可见存储在 v 中的值的类型为 int ; e" `' w7 ^' m8 v2 q7 q* [
cout<<v.typeToName(v.type())<<endl; /*输出 int,其中 type 返回存储值的枚举形式表示的类型,而 typeToName 则以字符串形式显示该枚举值所表示的类型。*/
5 A% `' A0 L3 c6 ]char c='b'; v.setValue(c); cout<<v.toString().toStdString()<<endl; //输出 b
2 Q z7 r9 b& m7 |" u. Ycout<<v.typeName()<<endl; /*输出 char,若是使用 QVariant 构造函数和直接赋值 char 型字符,此 处会输出 int,这是 setValue 与他们的区别。*/ 9 q# o+ E/ i7 u+ k: B
C mc; //自定义类型 C 的对象 mc : a; d* `3 ?1 o1 e9 }' N
//QVariant v1(mc); //错误,没有相应的构造函数。 : P3 M" j! G- r3 u- b% p8 c1 ~5 Z
QVariant v2; //v2=mc; //错误,没有与类型 C 匹配的赋值运算符函数。 //v2.setValue(mc); //错误,自定义类型 C 未使用宏 Q_DECLARE_METATYPE ) f6 v) g) O. i( H, V2 y
|