1、 QVariant 类用于封装数据成员的类型及取值等信息,该类类似于 C++ 共用体 union ,一个QVariant 对象,一次只能保存一个单一类型的值。该类封装了 Qt 中常用的类型,对于 QVariant 不支持的类型 ( 比如用户自定义类型 ) ,则需要 使 用 Q_DECLARE_METATYPE( Type )宏进行注册。" ?. y6 F2 U! P+ E. m2 I8 g+ z
2、QVariant 拥有常用类型的单形参构造函数,因此可把这些常用类型转换为 QVariant 类型,同时 QVariant 还重载了赋值运算符,因此可把常用类型的值直接赋给 QVariant 对象。注:由 C++语法可知,单形参构造函数可进行类型转换。
' l# J% P$ D2 z/ v; Q# D3、使用 QVariant 构造函数和赋值运算符。! X4 H7 H. R/ q& z$ Q
注意: QVariant 没有 char 类型的构造函数,若使用 char 值会被转换为对应的 int 型。( I) @# E9 n/ D! @3 N
QVariant v(1); // 调用 QVariant(int) 构造函数创建一个 QVariant 类型的对象,并把数值 1 保存到 v 中。' b/ ^, Z, E; E3 f
v=2; // 调用 QVariant 的赋值运算符,把值 2 保存在 v 之中,因为 QVariant 是类似于共用体的类, 因此同一时间只会保存一个值。# k P! I0 M% g1 ^- D
- x6 |9 S8 u- ~ [# w" {. [/ W9 p5 [
4、 获取 QVariant 对象存储的值的类型,可使用如下函数:; ~ f* Q- a6 i6 N$ y
Type type() const. G) W2 [$ Y; f/ }) w7 A( P0 L
获取 QVariant 对象当前存储值的类型,类型以枚举 QMetaType::Type 的形式表示" f1 ~% Q T3 {; X6 i" Z
- U) m4 H, i; F: nconst char * typeName() const;
; u3 d! n$ i- p E3 P' y8 h以字符串的形式返回 QVariant 对象存储的值的类型。若是无效类型则返回 0 。
. M0 ]8 [* ^2 Fconst char* typeToName(int t);; P V% b1 P+ t4 {9 |( R2 X
把以枚举类型 QMetaType::Type 表示的类型以字符串的形式返回。若枚举值QMetaType::
8 S! }- z: t. |4 ~3 @UnknownType 或不存在,则返回一个空指针。
& U8 L( Z0 y3 F3 a% I6 M8 k5 J! ~5 Q
示例:' O3 q0 U, ]* F; m0 Y
- * B* I( j: o5 k) H) _8 e5 W- [0 m
$ H. s3 W3 ?/ H/ b* x$ ?QVariant v(1);# W1 g4 o/ I: J) V
/ h0 G, t. S7 Q& }4 n - + u t' B3 Q1 d3 a. L
/ U! f! @! q7 d4 L( @& |/ o: g
cout<<v.typeName()<<endl; //输出 int
( j. Z4 R4 ], I" E# F3 ]+ ^) i4 T
& _5 [ `. Z2 Y6 @: n9 \8 H
1 g6 P3 }# k; e( u. \ S
# G/ [" x# [. N& ~( Gcout<<v.typeToName(v.type())<<endl; //输出 int1 X" w% N2 Y- c; @- ?
4 H6 v+ h' I7 r' B* B0 S# S- Z
9 \9 m0 @: u/ N5 J' ` 1 }( k: M T8 {% K" c
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 已被废弃。 h; d: y# D5 W$ W( G; @5 K; k
7、使用 QVariant 的默认构造函数,将创建一个无效的 QVariant 对象(或空的 QVariant 对象), 可通过 isNull()成员函数进行判断。 - R/ t# h& V( K' I
QVariant v('a'); /*QVariant 没有专门的 char 构造函数,此处的字符 a 会被转换为 int 型,因此 v 中存储的是数值 97,而不是字符 a 。*/
: w7 \6 _ b0 T% ^1 x( F) \cout<<v.value<int>()<<endl; //输出 97 ' e- m% r3 E% P6 Z0 l1 H
cout<<v.value<char>()<<endl; //输出 a,将 97 转换为 char 型,并输出转换后的值。
8 Z" i, B; ^* x- Wcout<<v.toChar().toLatin1()<<endl; /*输出 a,原因同上,注意 toChar 返回的类型是 QChar 而不 是 char。*/
$ [1 ]/ I7 P" ?7 u2 |cout<<v.toString().toStdString()<<endl; /*输出 97,把存储在 v 中的值转换为 QString,然后以字 符串形式输出。*/ ) s4 I! Q2 D8 S/ J r2 f& A
cout<<v.typeName()<<endl; //输出 int,可见存储在 v 中的值的类型为 int
8 e7 Z# c8 w1 V8 K+ C- K0 z, ecout<<v.typeToName(v.type())<<endl; /*输出 int,其中 type 返回存储值的枚举形式表示的类型,而 typeToName 则以字符串形式显示该枚举值所表示的类型。*/
; v6 }* a9 p! E M. S6 p6 R# {char c='b'; v.setValue(c); cout<<v.toString().toStdString()<<endl; //输出 b 9 f* S0 k6 G4 I6 m5 r
cout<<v.typeName()<<endl; /*输出 char,若是使用 QVariant 构造函数和直接赋值 char 型字符,此 处会输出 int,这是 setValue 与他们的区别。*/
8 E& F R8 {9 n8 PC mc; //自定义类型 C 的对象 mc ) s! v2 N/ |: |9 J* u
//QVariant v1(mc); //错误,没有相应的构造函数。 , P8 N5 K3 s6 ^( g
QVariant v2; //v2=mc; //错误,没有与类型 C 匹配的赋值运算符函数。 //v2.setValue(mc); //错误,自定义类型 C 未使用宏 Q_DECLARE_METATYPE
% A; O. }- C: ]/ ? |