首页 > 其他分享 >Qt QVariant的用法

Qt QVariant的用法

时间:2022-11-21 15:58:49浏览次数:39  
标签:QVariant Qt int 数据类型 用法 var myClass data

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

介绍
  帮助文档上说:The QVariant class acts like a union for the most common 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::fromValue(const T &value) 或 void QVariant::setValue(const T &value)。获取用到了

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

.h文件声明

1 struct MyClass{
2     int id;
3     QString name;
4 };
5 Q_DECLARE_METATYPE(MyClass)

.cpp文件定义

 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::fromValue(myClass);
 9  
10  
11 //获取数据
12     QString str=data.value(0).toString();
13     int val=data.value(1).toInt();
14  
15     if(data[3].canConvert<MyClass>())
16     {
17         MyClass myClass=data[3].value<MyClass>();
18         int id=myClass.id;
19         QString name=myClass.name;
20     }

(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::fromValue((void*)event);
3     
4     //获取
5     QPaintEvent* e=(QPaintEvent*)var.value<void*>();

(5)还有种写法,用QVariant的构造函数QVariant(int typeId, const void *copy)。虽然不常用,特别是指针类型,即 QMetaType::VoidStar,和 QMetaType::QObjectStar,一般还是用fromValue。但是还是以存取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();

标签:QVariant,Qt,int,数据类型,用法,var,myClass,data
From: https://www.cnblogs.com/ybqjymy/p/16911613.html

相关文章

  • Qt QVariant与Json的各种纠葛
    前言我之前虽了解QVariant的一些性能,但是没有与Json各种的互转。以前我解析Json后,是将其转化为我自定义的结构体,既方便看,又方便调用,就是解析转换的时候麻烦些;后续看到......
  • ue3中的watch的用法
    watch函数收三个参数:需要进行监听的数据的数组,监听的数据发生改变时的回调配置项一、监听基础类型二、监听复杂类型复杂类型的监听有很多种情况,具体的内容如......
  • ToString()的用法
    当前时间staticvoidMain(string[]args)//主程序{//输出2022/11/21Console.WriteLine(DateTime.Now.ToString("d......
  • Oracle中ALTER TABLE的五种用法(一)
    首发微信公众号:SQL数据库运维原文链接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247485212&idx=1&sn=450e9e94fa709b5eeff0de371c62072b&chksm=ea37536cdd......
  • linux中sed用法读这一篇就够了
    1.概念sed是一种行编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(patternspace),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲......
  • QT + OpenGL
    1、QT+Opengl的优势1)安装简单,QT借助于Qt的封装,无需配置第三方库如:GLFW+GLADGLFWGLADGLFW解决操作系统层面的不同GLAD使得代码可以用于不同的Opengl驱动......
  • Qt中定时器的所有使用方式
    在Qt中使用定时器一般有三种方式:参考博客:​​Qt|定时器的使用-知乎​​​​QT定时器事件startTimer_谢永奇1的博客-_starttimer​​​​Qt之定时器_付康为的博客-qt定......
  • 为什么工业软件开发一般用的都是QT?
    这个说法不大准确吧,CAD、MATLAB、EDA、PRO-E、Proteus、POWERPCB是用的QT么?SAP、EBS(ORACLE)、LabView是用的QT么?西门子的工业控制类的软件(比如SIMATICSCADA)用的QT么?这些都......
  • MQTT生产实践总结与EMQX5.0探索
     引言之前做了一个系统,系统的一部分硬件设备是使用MQTT协议接入的,无奈只好去研究它。好不容拼凑出一套能用的代码,上生产以后频频出现故障,后来稀里糊涂的解决了,但是一直......
  • shell中的for循环用法详解
    https://www.jb51.net/article/186134.htmfor命令:foriin的各种用法:foriin“file1”“file2”“file3”foriin/boot/*foriin/etc/*.confforiin......