1、 QVariant 类用于封装数据成员的类型及取值等信息,该类类似于 C++ 共用体 union ,一个QVariant 对象,一次只能保存一个单一类型的值。该类封装了 Qt 中常用的类型,对于 QVariant 不支持的类型 ( 比如用户自定义类型 ) ,则需要 使 用 Q_DECLARE_METATYPE( Type )宏进行注册。5 \" n- n7 k3 {0 W+ q0 I
2、QVariant 拥有常用类型的单形参构造函数,因此可把这些常用类型转换为 QVariant 类型,同时 QVariant 还重载了赋值运算符,因此可把常用类型的值直接赋给 QVariant 对象。注:由 C++语法可知,单形参构造函数可进行类型转换。
f7 |1 r( G1 R: o- j6 N8 G3、使用 QVariant 构造函数和赋值运算符。3 }: _, r& I$ {9 Y
注意: QVariant 没有 char 类型的构造函数,若使用 char 值会被转换为对应的 int 型。
. d2 _1 G1 \* t* ^. r& jQVariant v(1); // 调用 QVariant(int) 构造函数创建一个 QVariant 类型的对象,并把数值 1 保存到 v 中。
4 V8 y4 R: Z0 Q5 r1 ^v=2; // 调用 QVariant 的赋值运算符,把值 2 保存在 v 之中,因为 QVariant 是类似于共用体的类, 因此同一时间只会保存一个值。. r+ z2 F0 T" b; r1 s- H+ B6 f
1 Z6 a0 v) Y, T" ?7 T2 a( R* P% E4、 获取 QVariant 对象存储的值的类型,可使用如下函数:) w) c0 h% ]7 W! L( |# e! X
Type type() const! P) {0 _9 y" c
获取 QVariant 对象当前存储值的类型,类型以枚举 QMetaType::Type 的形式表示, g9 ~6 ?6 y; U7 |
: _6 f+ j: e# _' L
const char * typeName() const;
) L; I+ T6 F6 f# L l, O+ C/ c以字符串的形式返回 QVariant 对象存储的值的类型。若是无效类型则返回 0 。) [* U$ H% Y7 @. @6 X- b6 h9 F: [
const char* typeToName(int t);" V* G9 y, \+ D! j# W: d# s
把以枚举类型 QMetaType::Type 表示的类型以字符串的形式返回。若枚举值QMetaType::
, ?! [+ @, h' o6 m. RUnknownType 或不存在,则返回一个空指针。
5 m% m, P, d- F: v. {/ {' f! }0 H; \) B; |0 T* ^+ s* C9 Z2 F. u
示例:' ]5 f; x8 h+ @+ q9 N8 \# S/ h; D
& \1 Z1 m+ Y6 S8 k4 d$ @
1 k" @% b. R7 ^2 z, V6 VQVariant v(1);
- c5 `& y# \2 N
]* x+ w) y7 V1 I- ) n6 y6 m r3 u: [% h* s6 c O
$ ?0 @9 X! t. Z* ?1 @9 {: D. z
cout<<v.typeName()<<endl; //输出 int
: k: T/ p* y8 G. ~- Z+ j# E4 x+ z5 V
1 i# M1 c a1 T1 L" H; [& A: \; j9 _: e: U
cout<<v.typeToName(v.type())<<endl; //输出 int" |5 N: O! u' J9 c# T. j
. j3 _* G0 A: X8 n1 @
. K0 `; @, h# K# V4 I \
8 t- ~' }' o* e' ^" g5、获取和设置 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 已被废弃。 + m6 ?7 t7 U" q+ a( b
7、使用 QVariant 的默认构造函数,将创建一个无效的 QVariant 对象(或空的 QVariant 对象), 可通过 isNull()成员函数进行判断。
7 v. N1 \& u7 M5 S4 b" d3 A3 A6 ]QVariant v('a'); /*QVariant 没有专门的 char 构造函数,此处的字符 a 会被转换为 int 型,因此 v 中存储的是数值 97,而不是字符 a 。*/ " }1 ]- k# z3 |% I7 p% T- a
cout<<v.value<int>()<<endl; //输出 97 6 {& I6 H, A8 X9 m% A
cout<<v.value<char>()<<endl; //输出 a,将 97 转换为 char 型,并输出转换后的值。 7 c& \+ m( A/ Z8 U6 p8 s- U* `" Y
cout<<v.toChar().toLatin1()<<endl; /*输出 a,原因同上,注意 toChar 返回的类型是 QChar 而不 是 char。*/ 7 [) B9 T( a4 x" |
cout<<v.toString().toStdString()<<endl; /*输出 97,把存储在 v 中的值转换为 QString,然后以字 符串形式输出。*/
; y$ Y0 X* H0 @! n! s4 Lcout<<v.typeName()<<endl; //输出 int,可见存储在 v 中的值的类型为 int # T( C* ~3 {; V) w" V" w6 U
cout<<v.typeToName(v.type())<<endl; /*输出 int,其中 type 返回存储值的枚举形式表示的类型,而 typeToName 则以字符串形式显示该枚举值所表示的类型。*/ 9 t' ~ K* A2 Z' F& p
char c='b'; v.setValue(c); cout<<v.toString().toStdString()<<endl; //输出 b 3 ?" `& n0 p$ |3 j4 h) _
cout<<v.typeName()<<endl; /*输出 char,若是使用 QVariant 构造函数和直接赋值 char 型字符,此 处会输出 int,这是 setValue 与他们的区别。*/ & v v8 q! k9 K" C4 J9 P
C mc; //自定义类型 C 的对象 mc
h4 t9 Z8 o8 [; y: v0 Q6 Z7 A( z//QVariant v1(mc); //错误,没有相应的构造函数。 " p: s* H2 }; d! z ^' d
QVariant v2; //v2=mc; //错误,没有与类型 C 匹配的赋值运算符函数。 //v2.setValue(mc); //错误,自定义类型 C 未使用宏 Q_DECLARE_METATYPE
; U* T3 E2 X4 A o4 i |