QVariant的用法

QVariant的用法前言 QVariant 这个类很神奇 或者说方便 很多时候 需要几种不同的数据类型需要传递 如果用结构体 又不大方便 容器保存的也只是一种数据类型 而 QVariant 则可以统统搞定 介绍帮助文档上说 TheQVariantc QVariant 这个类型充当着最常见

前言

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、QSizeQString,并且还有C++基本类型,如 int、float等。

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

Q_DECLARE_METATYPE(MyClass)




示例

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

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

 QVariant var=12; 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文件声明

 struct MyClass{ int id; QString name; }; Q_DECLARE_METATYPE(MyClass)

.cpp文件定义

//存储数据 MyClass myClass; myClass.id=0; myClass.name=QString("LiMing"); data[0]=QString("ddd"); data[1]=123; data[3]=QVariant::fromValue(myClass); //获取数据 QString str=data.value(0).toString(); int val=data.value(1).toInt(); if(data[3].canConvert 
  
    ()) { MyClass myClass=data[3].value 
   
     (); int id=myClass.id; QString name=myClass.name; } 
    
  

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

 //-------------------------------char-------------------------- //char -> QVariant QVariant var='B'; qDebug()< 
  
    char char channel=var.toInt(); //------------------------------short-------------------------- //short -> QVariant short dataType=12; QVariant var2=dataType; qDebug()< 
   
     short short temp=(short)var2.toInt(); 
    
  

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

 //保存 QVariant var=QVariant::fromValue((void*)event); //获取 QPaintEvent* e=(QPaintEvent*)var.value 
  
    (); 
  

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

起码知道写法。

 QObject* obj=new QObject; obj->setObjectName("myObj"); //保存 QVariant var=QVariant(QMetaType::QObjectStar,&obj); //提取 QObject* myobj=qvariant_cast 
  
    (var); if(myobj!=NULL) qDebug()< 
   
     objectName(); obj->deleteLater(); 
    
  

(6) QVariant与json之间的各种转换

QVariant与Json的各种纠葛——Qt_十年之少的博客-CSDN博客

结束语

程序中有很多小点,存储着很大的智慧,就如QVariant就是如此。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/212912.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午6:58
下一篇 2026年3月18日 下午6:58


相关推荐

  • Java Object转JSONObject[通俗易懂]

    Java Object转JSONObject[通俗易懂]JSONObjectjson=(JSONObject)JSONObject.toJSON(list.get(0));

    2022年4月27日
    622
  • Java中notify和notifyAll的区别 – 何时以及如何使用

    Java中notify和notifyAll的区别 – 何时以及如何使用用 Java 通知 vsnotifyAlln 和 notifyAll 方法之间有什么区别是棘手的 Java 问题之一 这很容易回答但是一旦访问者提出后续问题 你要么感到困惑 要么无法提供明确的答案 notify 和 notifyAll 之间的主要区别在于 notify 方法只通知一个 Thread notifyAll 方法将通知在该监视器上等待的所有线程或锁定 顺便说一句 这是你在各地阅读的内容 坦率地说 这句话

    2026年3月19日
    2
  • js 图片base64转file文件的两种方式

    js 图片base64转file文件的两种方式nbsp nbsp nbsp nbsp 最近项目中需要实现把图片的 base64 编码转成 file 文件的功能 然后再上传至服务器 起初是直接通过 newFile 的方式进行转换 在各个主流的浏览器基本上都支持 Android 也没问题 但是在 ios 系统埋了个坑 ios11 4 以下的系统上传失败 定位 bug 发现是 newFile 这个方法不兼容 ios 系统 只能另辟蹊径 最后找到一个方法就是 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp

    2026年3月16日
    1
  • 超详细pycharm(专业版)+远程调试+本地和服务器代码同步

    超详细pycharm(专业版)+远程调试+本地和服务器代码同步超详细 pycharm 专业版 远程调试 本地和服务器代码同步文章目录一 pycharm 专业版二 配置步骤总结一 pycharm 专业版 pycharm 分为社区版和专业版 具有远程连接代码的是专业版 学生可以申请专业版 二 配置步骤以 detectron2 代码为例 我的代码在服务器上 将其同步到本地 pycharm 方便调试 首先创建一个本地文件夹 然后依次选择 Tools gt gt Deployment gt gt Configuratio 依次点击 gt gt SFTP 随便创建一个

    2026年3月27日
    2
  • Openclaw如何配置channel?配置指南及平替详解

    Openclaw如何配置channel?配置指南及平替详解

    2026年3月13日
    2
  • 1.缓存Redis实战操作记录

    1.缓存Redis实战操作记录

    2021年7月12日
    91

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号