一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 4891|回复: 0

qt -- QVariant 类

[复制链接]
发表于 2023-4-9 22:18 | 显示全部楼层 |阅读模式
1、 QVariant 类用于封装数据成员的类型及取值等信息,该类类似于 C++ 共用体 union ,一个QVariant 对象,一次只能保存一个单一类型的值。该类封装了 Qt 中常用的类型,对于 QVariant 不支持的类型 ( 比如用户自定义类型 ) ,则需要 使 用 Q_DECLARE_METATYPE( Type )宏进行注册。
7 m" z# R, I( J1 r8 w2、QVariant 拥有常用类型的单形参构造函数,因此可把这些常用类型转换为 QVariant 类型,同时 QVariant 还重载了赋值运算符,因此可把常用类型的值直接赋给 QVariant 对象。注:由 C++语法可知,单形参构造函数可进行类型转换。
+ a" Q9 N1 d9 A3、使用 QVariant 构造函数和赋值运算符。( e9 m" O3 x5 v
注意: QVariant 没有 char 类型的构造函数,若使用 char 值会被转换为对应的 int 型。8 e: T8 w2 k3 Z& t' b, M
QVariant v(1); // 调用 QVariant(int) 构造函数创建一个 QVariant 类型的对象,并把数值 1 保存到 v 中。8 _' X( \' P$ I) J) R$ {
v=2; // 调用 QVariant 的赋值运算符,把值 2 保存在 v 之中,因为 QVariant 是类似于共用体的类, 因此同一时间只会保存一个值。
! r( X' {. ?6 a% G9 o% D9 j0 F0 M; W4 N* u  A
4、 获取 QVariant 对象存储的值的类型,可使用如下函数:" }: ~7 c* `% Y3 A3 u; a
Type type() const( W+ O" l% ]2 I+ Q! M1 A- H# W2 G
获取 QVariant 对象当前存储值的类型,类型以枚举 QMetaType::Type 的形式表示3 p: O" U! n, r+ k+ |8 ?
, F8 W- a. a  q' W- M! [7 ~
const char * typeName() const;
7 t0 J/ t% W+ |6 p以字符串的形式返回 QVariant 对象存储的值的类型。若是无效类型则返回 0 。
; r2 j4 l. l5 G/ aconst char* typeToName(int t);8 q1 L3 G2 |# ~
把以枚举类型 QMetaType::Type 表示的类型以字符串的形式返回。若枚举值QMetaType::
" @* p& b9 l3 V( {8 ?$ V8 O5 rUnknownType 或不存在,则返回一个空指针。
1 i$ X  x) {& |/ O/ D% C% `" e2 V* o
, s2 a, i! v8 O% j+ K1 g示例:
* {0 u" [5 r+ y2 N7 Y: r
  • - D! i, |0 q. H( j, ^8 `( r$ z3 t

    4 ^$ U+ F( \! t  x' m' a" dQVariant v(1);
    % J, K0 `' Y5 i( M) V
    : H, w) t4 W$ y, x. s+ M
  • ! J7 Y' H- q) [+ t1 g: @

    5 b& [( k6 B0 N5 v# e( Gcout<<v.typeName()<<endl; //输出 int) P& }2 h: _2 @* W) f$ ]5 R

    4 L) Y& w% g! b) X  D
  • # H3 _* H7 R6 [( @: K( ]

    5 L2 r! ?; Y9 v7 A' g4 u0 v9 e+ rcout<<v.typeToName(v.type())<<endl; //输出 int
    2 h/ W* }7 ^8 v, {7 l1 g# C" |
    / ~6 U, L8 L2 O% A% H& H* |

    : |: b, J# {7 a* X0 h9 u3 w

+ u$ n; f; S1 V* |# N1 F

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 已被废弃。

4 k' ?) [+ S9 L) J

7、使用 QVariant 的默认构造函数,将创建一个无效的 QVariant 对象(或空的 QVariant 对象), 可通过 isNull()成员函数进行判断。

" D* m5 ~6 [+ Q  ]' l

QVariant v('a'); /*QVariant 没有专门的 char 构造函数,此处的字符 a 会被转换为 int 型,因此 v

中存储的是数值 97,而不是字符 a 。*/

- z6 Z/ e" K( q% S& X

cout<<v.value<int>()<<endl; //输出 97

. z- j; M; A0 [9 N4 `* @

cout<<v.value<char>()<<endl; //输出 a,将 97 转换为 char 型,并输出转换后的值。


2 w' M$ g; u0 [" n, U; q" r

cout<<v.toChar().toLatin1()<<endl; /*输出 a,原因同上,注意 toChar 返回的类型是 QChar 而不

是 char。*/


0 c3 _) Q1 K# B; @

cout<<v.toString().toStdString()<<endl; /*输出 97,把存储在 v 中的值转换为 QString,然后以字

符串形式输出。*/

# j$ p$ c8 c+ I3 j

cout<<v.typeName()<<endl; //输出 int,可见存储在 v 中的值的类型为 int


1 h5 F8 o/ i4 ]- {3 I2 X3 A( {

cout<<v.typeToName(v.type())<<endl; /*输出 int,其中 type 返回存储值的枚举形式表示的类型,而

typeToName 则以字符串形式显示该枚举值所表示的类型。*/

2 R* r; d/ }/ T2 s# O

char c='b';

v.setValue(c);

cout<<v.toString().toStdString()<<endl; //输出 b

5 r6 J% k- V& L1 O$ T( @+ b

cout<<v.typeName()<<endl; /*输出 char,若是使用 QVariant 构造函数和直接赋值 char 型字符,此

处会输出 int,这是 setValue 与他们的区别。*/


* `& Y2 c/ G4 I2 [' m8 J

C mc; //自定义类型 C 的对象 mc


* r& L; ^' M1 e+ P6 q& K# g, |

//QVariant v1(mc); //错误,没有相应的构造函数。


" {! K1 r! `* ~8 @" V

QVariant v2;

//v2=mc; //错误,没有与类型 C 匹配的赋值运算符函数。

//v2.setValue(mc); //错误,自定义类型 C 未使用宏 Q_DECLARE_METATYPE

9 {$ G; x+ I! d/ {# ]8 j2 ?

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2026-2-25 11:33 , Processed in 0.029712 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表