1、 QVariant 类用于封装数据成员的类型及取值等信息,该类类似于 C++ 共用体 union ,一个QVariant 对象,一次只能保存一个单一类型的值。该类封装了 Qt 中常用的类型,对于 QVariant 不支持的类型 ( 比如用户自定义类型 ) ,则需要 使 用 Q_DECLARE_METATYPE( Type )宏进行注册。/ t1 `2 q( |+ A* f3 D9 `! V
2、QVariant 拥有常用类型的单形参构造函数,因此可把这些常用类型转换为 QVariant 类型,同时 QVariant 还重载了赋值运算符,因此可把常用类型的值直接赋给 QVariant 对象。注:由 C++语法可知,单形参构造函数可进行类型转换。
$ O, r$ G2 {/ G4 m) C- R3、使用 QVariant 构造函数和赋值运算符。& z: a! n) m1 K/ y. W
注意: QVariant 没有 char 类型的构造函数,若使用 char 值会被转换为对应的 int 型。' M! t* @$ A* K( {# }0 Y
QVariant v(1); // 调用 QVariant(int) 构造函数创建一个 QVariant 类型的对象,并把数值 1 保存到 v 中。
4 i+ |6 n% a2 {7 i5 q3 [) Y7 U; G: }2 Mv=2; // 调用 QVariant 的赋值运算符,把值 2 保存在 v 之中,因为 QVariant 是类似于共用体的类, 因此同一时间只会保存一个值。. Q) u# c! h0 y4 j4 d9 ~4 x
- R: @" y+ S# q* g% }6 B* J
4、 获取 QVariant 对象存储的值的类型,可使用如下函数:& L: d9 w$ g _2 E' G& b( {& B
Type type() const
' g* f$ @. L$ l) V获取 QVariant 对象当前存储值的类型,类型以枚举 QMetaType::Type 的形式表示- F/ b; I% C! {# l$ x
# [6 w0 J4 E h- K1 x- R* i
const char * typeName() const;
" ~* ]% ?# ^, M- ]6 u- O) t以字符串的形式返回 QVariant 对象存储的值的类型。若是无效类型则返回 0 。
; z3 r' ] R& N2 m! Pconst char* typeToName(int t);
3 J! H- h2 B7 J6 H把以枚举类型 QMetaType::Type 表示的类型以字符串的形式返回。若枚举值QMetaType::9 r0 v+ A$ N& t4 }4 r9 e& c
UnknownType 或不存在,则返回一个空指针。
3 }3 T( v O' p% I
$ j$ e8 v$ y. G _. }示例:
) j- W, Z; Q3 ^
6 ~7 ~0 D# x7 V9 H* h) b3 \
9 H* k" x. r+ }. ^- r5 JQVariant v(1);# }$ n w- |7 t2 E ~/ P
! S) X( y* a1 K
- ; S1 x5 m3 B1 X$ J) ~
, M- q* B' G9 G' s* W U+ V2 Y$ w) f7 s
cout<<v.typeName()<<endl; //输出 int6 I b% Z+ T% \# G8 K9 `0 h1 j/ ~
$ q* w5 R3 M3 R3 D8 U6 [2 A - * N$ X& F2 U* [ o" i" @5 m
. o7 D9 k+ j6 X+ A
cout<<v.typeToName(v.type())<<endl; //输出 int) C+ t0 E$ K3 I0 T' ?0 F2 v
7 B7 m7 w+ P( L& r
0 U2 p& j8 N0 Y5 R
9 d, c. N- p- b6 g) p: A; |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 已被废弃。
6 `: i, f; e: l$ a7、使用 QVariant 的默认构造函数,将创建一个无效的 QVariant 对象(或空的 QVariant 对象), 可通过 isNull()成员函数进行判断。
9 t! `( ]. Q4 _5 M: h& r& AQVariant v('a'); /*QVariant 没有专门的 char 构造函数,此处的字符 a 会被转换为 int 型,因此 v 中存储的是数值 97,而不是字符 a 。*/ . [( a0 f9 F" x3 X6 j
cout<<v.value<int>()<<endl; //输出 97
/ T0 n! P z) c- `cout<<v.value<char>()<<endl; //输出 a,将 97 转换为 char 型,并输出转换后的值。
5 S8 w! j+ C8 w) D: S9 H) ycout<<v.toChar().toLatin1()<<endl; /*输出 a,原因同上,注意 toChar 返回的类型是 QChar 而不 是 char。*/ # x" l* H& p6 y$ |
cout<<v.toString().toStdString()<<endl; /*输出 97,把存储在 v 中的值转换为 QString,然后以字 符串形式输出。*/ 3 ~% [* g" p7 X U V! u+ p# J
cout<<v.typeName()<<endl; //输出 int,可见存储在 v 中的值的类型为 int
! l. w: K4 y1 U8 ?' Gcout<<v.typeToName(v.type())<<endl; /*输出 int,其中 type 返回存储值的枚举形式表示的类型,而 typeToName 则以字符串形式显示该枚举值所表示的类型。*/ " T* d9 t% C9 R* E: I
char c='b'; v.setValue(c); cout<<v.toString().toStdString()<<endl; //输出 b + G4 O& C- F9 r9 s, x
cout<<v.typeName()<<endl; /*输出 char,若是使用 QVariant 构造函数和直接赋值 char 型字符,此 处会输出 int,这是 setValue 与他们的区别。*/
+ h/ v6 \5 }: D2 rC mc; //自定义类型 C 的对象 mc 7 O& y7 t0 Z% K9 c
//QVariant v1(mc); //错误,没有相应的构造函数。 ! e/ `9 u: G n0 D, f& _5 D* L: o
QVariant v2; //v2=mc; //错误,没有与类型 C 匹配的赋值运算符函数。 //v2.setValue(mc); //错误,自定义类型 C 未使用宏 Q_DECLARE_METATYPE
! y$ u) X% ^8 U |