1、 QVariant 类用于封装数据成员的类型及取值等信息,该类类似于 C++ 共用体 union ,一个QVariant 对象,一次只能保存一个单一类型的值。该类封装了 Qt 中常用的类型,对于 QVariant 不支持的类型 ( 比如用户自定义类型 ) ,则需要 使 用 Q_DECLARE_METATYPE( Type )宏进行注册。
$ V2 K$ T2 c1 H4 ~! T. l7 @2、QVariant 拥有常用类型的单形参构造函数,因此可把这些常用类型转换为 QVariant 类型,同时 QVariant 还重载了赋值运算符,因此可把常用类型的值直接赋给 QVariant 对象。注:由 C++语法可知,单形参构造函数可进行类型转换。9 \8 L/ l# H! F2 W; p# O
3、使用 QVariant 构造函数和赋值运算符。
+ ], z& U6 L& Z! K4 x9 t注意: QVariant 没有 char 类型的构造函数,若使用 char 值会被转换为对应的 int 型。
/ i/ j) @' E0 ~5 jQVariant v(1); // 调用 QVariant(int) 构造函数创建一个 QVariant 类型的对象,并把数值 1 保存到 v 中。
' T$ P( p5 v3 c% [1 u+ vv=2; // 调用 QVariant 的赋值运算符,把值 2 保存在 v 之中,因为 QVariant 是类似于共用体的类, 因此同一时间只会保存一个值。/ K. ]' {' q. o ?
; F6 s' m+ J' ]4、 获取 QVariant 对象存储的值的类型,可使用如下函数:
, S# x& `% ]7 w G7 g5 g7 E' dType type() const" Y. u2 K) [0 ?( @ ^% x$ Z) \) Y
获取 QVariant 对象当前存储值的类型,类型以枚举 QMetaType::Type 的形式表示
( B3 V f' I9 T' X* Q: K T: P' J5 v( @
( b6 W$ u/ X: k! X4 b: m. {; {const char * typeName() const;+ P3 Y. |' [( |6 ~2 I0 j7 V0 H) }
以字符串的形式返回 QVariant 对象存储的值的类型。若是无效类型则返回 0 。
9 y0 v! u+ s% ]7 V/ Mconst char* typeToName(int t);3 T/ t3 Z3 O" o. {: M. g8 ?) E p
把以枚举类型 QMetaType::Type 表示的类型以字符串的形式返回。若枚举值QMetaType::- q' @8 L3 [$ W7 D
UnknownType 或不存在,则返回一个空指针。 ?* F, s* m! Z) B3 j
/ }2 j) n( c) M. w u示例:/ ]4 R5 c% Y" u c
A4 t! F% h6 Q+ i9 b% c" d: p- T# O4 G
QVariant v(1); N) k4 Y1 W8 G) q8 {: `
/ |5 P8 j) f: n" y+ o* l- ; B1 C+ Z7 ?' G9 w' B
! [ N% A; r" X$ ~, b/ ]' x+ B1 Bcout<<v.typeName()<<endl; //输出 int" a$ J+ a8 L |+ M6 i, n$ [
9 c5 R- `; s( ?3 B - , R' F% j* H f/ C
4 H; q4 u, u! ~6 x5 z! Acout<<v.typeToName(v.type())<<endl; //输出 int
" a; c' j1 m' g. f/ Q& u0 Y: B) I( T7 d: q& U) n1 l' k( t
, H# N. i: C5 j; e+ t q! ~
, D3 K _4 a( G @5 w$ v5、获取和设置 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 已被废弃。
% V# I7 t4 @# }4 O7 |7、使用 QVariant 的默认构造函数,将创建一个无效的 QVariant 对象(或空的 QVariant 对象), 可通过 isNull()成员函数进行判断。
' _- S/ L4 @' `, C" I% BQVariant v('a'); /*QVariant 没有专门的 char 构造函数,此处的字符 a 会被转换为 int 型,因此 v 中存储的是数值 97,而不是字符 a 。*/ : V, B" a3 D5 z
cout<<v.value<int>()<<endl; //输出 97
% l1 a3 A3 o% Z* |1 O2 Tcout<<v.value<char>()<<endl; //输出 a,将 97 转换为 char 型,并输出转换后的值。
3 `6 x- A. T j& o# v% v8 wcout<<v.toChar().toLatin1()<<endl; /*输出 a,原因同上,注意 toChar 返回的类型是 QChar 而不 是 char。*/
! g0 ^% r( e8 D A1 [; \8 m& T; \cout<<v.toString().toStdString()<<endl; /*输出 97,把存储在 v 中的值转换为 QString,然后以字 符串形式输出。*/
! Q2 f- p5 k; zcout<<v.typeName()<<endl; //输出 int,可见存储在 v 中的值的类型为 int ( e" b2 R( t3 l* n( C
cout<<v.typeToName(v.type())<<endl; /*输出 int,其中 type 返回存储值的枚举形式表示的类型,而 typeToName 则以字符串形式显示该枚举值所表示的类型。*/
! R, r: M1 |$ u6 ~: b- h9 T, Hchar c='b'; v.setValue(c); cout<<v.toString().toStdString()<<endl; //输出 b / K X1 i8 [! E
cout<<v.typeName()<<endl; /*输出 char,若是使用 QVariant 构造函数和直接赋值 char 型字符,此 处会输出 int,这是 setValue 与他们的区别。*/
; ^# j/ ?. ^5 W' t9 _& w# G( C3 mC mc; //自定义类型 C 的对象 mc 9 e7 ?) i4 V( O) b. x
//QVariant v1(mc); //错误,没有相应的构造函数。 4 C! T* z3 e Y5 |8 W5 X
QVariant v2; //v2=mc; //错误,没有与类型 C 匹配的赋值运算符函数。 //v2.setValue(mc); //错误,自定义类型 C 未使用宏 Q_DECLARE_METATYPE % f/ G s5 h; P! \/ R% v8 ~
|