当前位置: 首页 > 网络知识

Qt QVariant的用法

时间:2026-01-25 16:16:50

前言
  QVariant这个类很神奇,或者说方便。很多时候,需要几种不同的数据类型需要传递,如果用结构体,又不大方便,容器保存的也只是一种数据类型,而QVariant则可以统统搞定。

介绍
  帮助文档上说:The QVariant class acts like a union for the most cmon Qt data types.。

  QVariant 这个类型充当着最常见的数据类型的联合。QVariant 可以保存很多Qt的数据类型,包括QBrush、QColor、QCursor、QDateTime、QFont、QKeySequence、 QPalette、QPen、QPixmap、QPoint、QRect、QRegion、QSize和QString,并且还有C++基本类型,如 int、float等。

  当然,如果支持的类型没有想要的,没关系,QVariant也可以支持自定义的数据类型。被QVariant存储的数据类型需要有一个默认的构造函数和一个拷贝构造函数。为了实现这个功能,首先必须使用Q_DECLARE_METATYPE()宏。通常会将这个宏放在类的声明所在头文件的下面:

Q_DECLARE_METATYPE(MyClass)

示例
(1)支持的类型。对于QVariant支持的类型,可直接赋值,但是取值时,对于存入的是什么类型,取出也要为这个类型。如存入为int类型,输出为toString()

1 QVariant var; 2 var.setValue(12); 3 int data=var.toInt();

1 QVariant var=12; 2 int data=var.toInt();

(2)对于不支持的类型,如自己定义的结构体。由于Qt都是基于元对象系统,故要在头文件里面要注册此类属于元类型。存储用到了QVariant QVariant::frValue(const T &value) 或 void QVariant::setValue(const T &value)。获取用到了

T QVariant::value() const,在这之前一般要bool QVariant::canConvert(int targetTypeId) const先用进行判断,是否可以转换。例子如下:

.h文件声明

1 struct MyClass; 5 Q_DECLARE_METATYPE(MyClass)

pp文件定义

1 //存储数据 2 MyClass myClass; 3 myClass.id=0; 4 myClass.name=QString("LiMing"); 5 6 data[0]=QString("ddd"); 7 data[1]=123; 8 data[3]=QVariant::frValue(myClass); 9 10 11 //获取数据 12 QString str=data.value(0).toString(); 13 int val=data.value(1).toInt(); 14 15 if(data[3]anConvert<MyClass>()) 16

(3)对于不支持的C++基础数据类型,如 short char,先通过toInt()转化为int类型,然后再将int转为其原本的数据类型。

1 //char 2 //char > QVariant 3 QVariant var='B'; 4 qDebug()<<var; //QVariant(int, 66) 5 6 7 // QVariant >char 8 char channel=var.toInt(); 9 10 //short 11 //short > QVariant 12 short dataType=12; 13 QVariant var2=dataType; 14 qDebug()<<var2; //QVariant(int, 12) 15 16 17 //QVariant > short 18 short temp=(short)var2.toInt();

(4)保存指针,感觉这个比较强大,也比较容易用到。如

1 //保存 2 QVariant var=QVariant::frValue((void*)event); 3 4 //获取 5 QPaintEvent* e=(QPaintEvent*)var.value<void*>();

(5)还有种写法,用QVariant的构造函数QVariant(int typeId, const void *copy)。虽然不常用,特别是指针类型,即 QMetaType::VoidStar,和 QMetaType::QObjectStar,一般还是用frValue。但是还是以存取QObject*为例补充下吧,

起码知道写法。

1 QObject* obj=new QObject; 2 obj>setObjectName("myObj"); 3 4 //保存 5 QVariant var=QVariant(QMetaType::QObjectStar,&obj); 6 7 //提取 8 QObject* myobj=qvariant_cast<QObject*>(var); 9 if(myobj!=NULL) 10 qDebug()<<myobj>objectName(); 11 12 obj>deleteLater();


上一篇:安全PLC和普通PLC的区别
下一篇:Qt QRect 和 OpenCV cv::Rect 的区别
Qt
  • 英特尔与 Vertiv 合作开发液冷 AI 处理器
  • 英特尔第五代 Xeon CPU 来了:详细信息和行业反应
  • 由于云计算放缓引发扩张担忧,甲骨文股价暴跌
  • Web开发状况报告详细介绍可组合架构的优点
  • 如何使用 PowerShell 的 Get-Date Cmdlet 创建时间戳
  • 美光在数据中心需求增长后给出了强有力的预测
  • 2027服务器市场价值将接近1960亿美元
  • 生成式人工智能的下一步是什么?
  • 分享在外部存储上安装Ubuntu的5种方法技巧
  • 全球数据中心发展的关键考虑因素
  • 英特尔与 Vertiv 合作开发液冷 AI 处理器

    英特尔第五代 Xeon CPU 来了:详细信息和行业反应

    由于云计算放缓引发扩张担忧,甲骨文股价暴跌

    Web开发状况报告详细介绍可组合架构的优点

    如何使用 PowerShell 的 Get-Date Cmdlet 创建时间戳

    美光在数据中心需求增长后给出了强有力的预测

    2027服务器市场价值将接近1960亿美元

    生成式人工智能的下一步是什么?

    分享在外部存储上安装Ubuntu的5种方法技巧

    全球数据中心发展的关键考虑因素