QVariant的用法

2023-10-31

前言

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支持的类型,可直接赋值,但是取值时,对于存入的是什么类型,取出也要为这个类型。

    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 myClass=data[3].value<MyClass>();
        int id=myClass.id;
        QString name=myClass.name;
    }

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


//-------------------------------char--------------------------
//char -> QVariant
QVariant var='B';
qDebug()<<var;   //QVariant(int, 66)


// QVariant ->char
char channel=var.toInt();

//------------------------------short--------------------------
//short -> QVariant
short dataType=12;
QVariant var2=dataType;
qDebug()<<var2;      //QVariant(int, 12)


//QVariant -> short
short temp=(short)var2.toInt();

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

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

  (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<QObject*>(var);
    if(myobj!=NULL)
        qDebug()<<myobj->objectName();

    obj->deleteLater();

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

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

警告:不要盲目的随便使用QVariant之类,它比较消耗内存和影响处理速度!!!

结束语

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QVariant的用法 的相关文章

随机推荐

  • 微信小程序和微信公众号关联

    本篇讲述讲把微信小程序关联到微信公众号上 使其能在微信公众号中直接进入小程序 首先 我们的微信小程序要是已经发布好的 如果不知道怎么发布小程序 可以看我的上一篇文章 下面将小程序关联到微信公众号上去 使用微信公众号账号登录微信公众平台 进入
  • python wifi密码本下载_WifiPass下载 WifiPass(Python获取本机保存的所有WIFI密码) 免费版 下载-脚本之家...

    WifiPass Python获取本机保存的所有WIFI密码 是由大神写的一个python脚本 可用于获取PC上保存过的所有WIFI密码 因为XP和Win7系统保存的位置不相同 XP在注册表 而Win7 Vista等在ProgramData
  • 网络编程套接字,Linux下实现echo服务器和客户端

    目录 1 一些网络中的名词 1 1 IP地址 1 2 端口号port 1 3 端口号 和 进程ID 1 4 初始TCP协议 1 5 UDP协议 2 socket编程接口 2 1 socket 常见API 2 2 sockaddr结构 3 简
  • chatgpt赋能python:Python手动安装whl文件的方法

    Python手动安装whl文件的方法 Python是目前最为流行的编程语言之一 广泛应用于数据分析 AI Web开发等领域 Python的强大之处不仅在于其灵活的语法 更在于丰富的第三方库资源 这些库资源往往以 whl文件格式提供 而手动安
  • kali linux破解wifi密码-超详细过程

    前期准备 VMware Workstation虚拟机 在虚拟机安装好kail linunx系统 无线网卡 芯片为3070或者1887L都支持Linux 或者直接某宝上查kali无线网卡 一 打开终端 用airmon ng命令查看 如果出现无
  • Matplotlib学习---用matplotlib画散点图,气泡图(scatter plot, bubble chart)

    Matplotlib里有两种画散点图的方法 一种是用ax plot画 一种是用ax scatter画 一 用ax plot画 ax plot x y marker o color black 二 用ax scatter画 ax scatte
  • jav中spark迁移hive到mongo(更新数据)

    业务中的数据库使用的mongo 离线使用spark计算的每天统计指标需要累加到历史指标中 然后将结果写到mongo库中 如果mongo库中已经有这条记录则覆盖 mongo库中没有此记录则为新增 我们如果根据 MongoSpark save
  • StringUtils.isAnyBlank() StringUtils.isNoneBlank()

    StringUtils isAnyBlank 是否包含任何真空值 包含空格或空值 StringUtils isAnyBlank null true StringUtils isAnyBlank null foo true StringUti
  • Dapp开发教程一 Asch Dapp Hello World

    1 基本流程 Asch有三种net localnet testnet mainnet 后两种是发布到线上的 可通过公网访问 第一种localnet是运行在本地的 只有一个节点的私链 主要是为了方便本地测试和开发 Dapp的开发同样要涉及到这
  • HDFS的副本数量配置

    众所周知 hdfs的默认副本数量是3个 配置在 etc hadoop conf hdfs site xml中
  • uni-app多端开发注意事项

    关于vue 1 注意 如果使用老版的非自定义组件模式 即manifest中 usingComponents false 部分模版语法不支持 但此模式已于2019年11月起下线 2 data 必须声明为返回一个初始数据对象的函数 否则页面关闭
  • iOS进阶—Runtime基础

    iOS进阶 目录 GitHub参考 RunTime 基础 一个程序的执行过程 大概就是代码 gt 编译链接 gt 执行 C语言 import
  • Acwing-4645. 选数异或

    暴力解法 TLE了 呜呜呜呜 include
  • Linux系统下安装Redis

    文章目录 下载Redis 上传至Linux服务器 安装Redis 基本环境安装 运行Redis redis benchmark性能测试 下载Redis 下载地址 https redis io 上传至Linux服务器 可借助任何一款ftp软件
  • IT人员必学最基础知识(一)——总括

    作为一个真正的IT人员 我们不仅要懂得高级语言的编程使用 更要懂得电脑最基础的知识 这是我们成为杰出的IT人员的基石 只要踏上这些基础知识我们才能走的更高 首先我们要懂得电脑是如何工作的 大千世界无奇不有 繁彩纷呈 而一台小小的电脑就可以处
  • 算法入门:双指针法

    一 双指针法 例子1 求一个有序数组中和 8的下标 设置两个不同的指针 或者头 或者尾 在一个递增的序列中 根据结果分类 说明指针的下一步应该怎么移动 结果分类 a i b j 8则i j 都相互靠近 a i b j lt 8 需要移动指针
  • 使用react-grid-layout和echarts-for-react实现一个支持拖拽的自定义响应式dashboard页面

    文章目录 使用react grid layout和echarts for react实现一个支持拖拽的自定义响应式dashboard页面 需求概要 技术栈 简单实现 参考 使用react grid layout和echarts for re
  • python画聚类树状图_聚类分析python画树状图--Plotly(dendrogram)用法解析

    1 前言 聚类分析是机器学习和数据分析中非常常见的分类方法 当我们用到层次聚类 系统聚类 时 最常用的分析方法就是绘制树状图 比较常见的统计软件像SPSS SAS R等都可以直接绘制树状图 比较简单 今天主要介绍下python怎么绘制 2
  • 校园欺凌——四位学生的乱伦之战!!!

    校园欺凌 Impossible 学生之战 Non existent 乱伦 Take leave ok 兄弟姊妹们 今天我们来学习循环结构第一章 gt gt gt While与Do Whlie 循环 重复得做某一件事情 Such as 打印5
  • QVariant的用法

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