1、 QVariant 类用于封装数据成员的类型及取值等信息,该类类似于 C++ 共用体 union ,一个QVariant 对象,一次只能保存一个单一类型的值。该类封装了 Qt 中常用的类型,对于 QVariant 不支持的类型 ( 比如用户自定义类型 ) ,则需要 使 用 Q_DECLARE_METATYPE( Type )宏进行注册。
4 V5 A3 ]$ x1 a) P8 P2、QVariant 拥有常用类型的单形参构造函数,因此可把这些常用类型转换为 QVariant 类型,同时 QVariant 还重载了赋值运算符,因此可把常用类型的值直接赋给 QVariant 对象。注:由 C++语法可知,单形参构造函数可进行类型转换。1 Y/ R5 D1 @/ [3 S o" h
3、使用 QVariant 构造函数和赋值运算符。
: \+ B" S" F7 Z- y注意: QVariant 没有 char 类型的构造函数,若使用 char 值会被转换为对应的 int 型。
0 z# L% U( D* l% `2 _+ k7 uQVariant v(1); // 调用 QVariant(int) 构造函数创建一个 QVariant 类型的对象,并把数值 1 保存到 v 中。
7 q4 q7 v& n1 X/ w5 Kv=2; // 调用 QVariant 的赋值运算符,把值 2 保存在 v 之中,因为 QVariant 是类似于共用体的类, 因此同一时间只会保存一个值。
4 a. r7 a! E. h% F- d! A
3 e5 V, [ P; q* q1 l/ k4、 获取 QVariant 对象存储的值的类型,可使用如下函数:* A F! l2 k* U
Type type() const* _5 l, R6 |9 C" k% Q6 |
获取 QVariant 对象当前存储值的类型,类型以枚举 QMetaType::Type 的形式表示* d B/ j1 `0 [( [% x: ]
: Q1 E6 A6 C- \* s: {! u0 I {* tconst char * typeName() const;
1 U* n, u5 K* n1 l Y3 O b以字符串的形式返回 QVariant 对象存储的值的类型。若是无效类型则返回 0 。
F& j" c: l6 u4 a- Uconst char* typeToName(int t);
- s$ v! ?7 i# V" z' ~把以枚举类型 QMetaType::Type 表示的类型以字符串的形式返回。若枚举值QMetaType::" P4 f4 F k, P2 ?) E0 C
UnknownType 或不存在,则返回一个空指针。 y! a" S1 s- V' U
& f. N4 R: N3 A0 W( z示例:9 Y' n9 z# q8 G- @. Q3 Y+ l
- ! B$ K" i3 A+ C1 p! V
! n* o. u4 M4 X, R- n; a. WQVariant v(1);* ]0 I; f% e& u* B
6 b" X$ N! l. T8 w/ o4 I - 2 P) X& ^# ?& |3 y' c" ^# V7 D
, I7 k! c: r+ W+ K% g9 ]
cout<<v.typeName()<<endl; //输出 int; \$ o. V8 t2 c* W7 I
& I4 W" ^2 a$ A! k- N
- ) J9 u3 |" V, E3 U8 m3 s
) J* G5 k8 {+ y
cout<<v.typeToName(v.type())<<endl; //输出 int0 i/ V0 ^7 Q( ]& Z% d" I$ K
/ Y; i+ j3 Y4 d3 D8 C
% Y8 y2 S t( i
" z* G# Y* g' m% D' k/ ?- ]; @& g
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 已被废弃。 0 B5 g7 p4 F+ t8 _3 Y: f* ?
7、使用 QVariant 的默认构造函数,将创建一个无效的 QVariant 对象(或空的 QVariant 对象), 可通过 isNull()成员函数进行判断。 8 I1 Q0 ?7 Y+ x! N
QVariant v('a'); /*QVariant 没有专门的 char 构造函数,此处的字符 a 会被转换为 int 型,因此 v 中存储的是数值 97,而不是字符 a 。*/ ) C; Q# b$ f, r' ?& }( w
cout<<v.value<int>()<<endl; //输出 97 1 |: d7 p) d) W, j/ @, A5 m
cout<<v.value<char>()<<endl; //输出 a,将 97 转换为 char 型,并输出转换后的值。
: k" b7 ]" q. |* L2 ncout<<v.toChar().toLatin1()<<endl; /*输出 a,原因同上,注意 toChar 返回的类型是 QChar 而不 是 char。*/
0 o! B7 F/ p+ r+ K! Y5 Y7 |4 ~cout<<v.toString().toStdString()<<endl; /*输出 97,把存储在 v 中的值转换为 QString,然后以字 符串形式输出。*/ [, L4 Z L2 N" J: o
cout<<v.typeName()<<endl; //输出 int,可见存储在 v 中的值的类型为 int
2 r. p6 D( s* Z7 M0 { J: s& R' `cout<<v.typeToName(v.type())<<endl; /*输出 int,其中 type 返回存储值的枚举形式表示的类型,而 typeToName 则以字符串形式显示该枚举值所表示的类型。*/ 3 y2 j6 B4 O& f8 t2 Q' u. F
char c='b'; v.setValue(c); cout<<v.toString().toStdString()<<endl; //输出 b
8 y& \7 k+ u, ~& C1 i7 }+ W8 m# Ocout<<v.typeName()<<endl; /*输出 char,若是使用 QVariant 构造函数和直接赋值 char 型字符,此 处会输出 int,这是 setValue 与他们的区别。*/ 4 g/ l0 ~) X" U) g; c+ S
C mc; //自定义类型 C 的对象 mc ; z& }4 `4 i( H
//QVariant v1(mc); //错误,没有相应的构造函数。
# T/ K4 C e( I& r# ^1 S5 j* b* aQVariant v2; //v2=mc; //错误,没有与类型 C 匹配的赋值运算符函数。 //v2.setValue(mc); //错误,自定义类型 C 未使用宏 Q_DECLARE_METATYPE
* y$ a% g$ C' o# t* t: @3 Y0 M: E |