QT中的QVariant类型-万能变量

2023-11-04

转自:https://blog.csdn.net/xiaopei_yan/article/details/81410092

前言

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()

    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)保存指针,感觉这个比较强大,也比较容易用到。如

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

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

QT中的QVariant类型-万能变量 的相关文章

随机推荐

  • 前端安全总结

    你的服务器安全么 1 概述 在本人所处的公司的服务器正式遭到黑客攻击之前 一直都以为 黑客 是个遥不可及的词 直到真正成为了受害者时 才猛然意识到安全的重要性 有一些基本经验和心得总结出来 和同行分享一下吧 2 暴破手段 最粗暴的黑客行为
  • AB test 之 广告投放(二)

    在广告投放的A B测试中 有几个重要的注意要点需要考虑 目标和假设 明确测试的目标 并基于此制定假设 确定您希望测试的指标 例如点击率 转化率 收入等 并提出假设 即测试组和对照组之间是否存在显著差异 随机分组 确保测试组和对照组的分配是随
  • 【强烈推荐】 十多款2023年必备国内外王炸级AI工具 (免费 精品 好用) 让你秒变神一样的装逼佬感受10倍生产力 (5) AI编程自动写代码

    个人主页 极客小俊 作者简介 web开发者 设计师 技术分享博主 希望大家多多支持一下 我们一起进步 如果文章对你有帮助的话 欢迎评论 点赞 收藏 加关注 AI 编程自动代码生成 AI现在真的是无敌 连代码都可以生成 我的天 看来程序员失业
  • Conflux Hydra网络Hardfork升级已完成(2022.02.28)

    Conflux Hydra 网络 Hardfork 升级已经完成 目前网络状态稳定 最新网络版本号 v2 0 0 fix END 了解最新动态
  • Java单例模式(解决反射攻击,反序列化攻击)

    单例模式 什么是单例模式 单例模式就是确保类的实例对象只能有一个 类本身要实例化好这个对象提供给其他所有的类访问 单例模式就是为了避免状态不一致 单例模式特定 单例类只能有一个实例 单例类必须自己创建自己的唯一实例 单例类必须给所有其他对象
  • 雷军的发布会,真狠呀!

    在雷军演讲前 人物 用今年的热搜话题向雷军进行了提问 问题1 年年演讲灌鸡汤 算是卖成功学吗 雷军 成功学 说实话我真的不太懂 我每年办演讲 主要想跟大家分享一些我成长的经历 问题2 把失败经历当笑话讲 这心态要怎么练 雷军 刚开始的时候我
  • 比较运算符、逻辑运算符

    不管是比较运算符还是逻辑运算符 重点都是运算 是运算的话都会得到一个结果值 先说比较运算符 大概就是上面这些运算符 看运算符怎么运算的 直接判断这个比较逻辑上是不是正确的 就比如4 3 很明显是正确的 结果是正确的 值是用布尔值表示的也就是
  • 创建带图文的超级菜单(导航菜单)(二)

    Avada带有一个超级菜单功能 基本是在WP原有的基础上扩充的 功能还是挺好用 下面说下如何创建比较漂亮的超级菜单 此文内容主要在于理解超级菜单和其他项目的逻辑关系 搞清楚它的逻辑你就好操作了 本文目录 1 整体思路 2 其他须知 3 创建
  • 关于微信小程序开发中input、textarea等表单组件在键盘弹起时,页面显示内容被挤出顶部导航栏,解决方案的建议

    关于微信小程序开发中input textarea等表单组件在键盘弹起时 页面显示内容被挤出顶部导航栏 解决方案的建议 代码附图 希望采纳 键盘弹起时 解决键盘遮挡问题 开启键盘时 function keyboardOcclusion e i
  • java 调用C#语言写的dll文件代码 超详细过程

    前言 最近在编写项目时候 遇到了java调用C 类库的情况 试了很多种方法 也遇到了很多坑 解决之后写下来 作为记录和分享给有用的朋友们 在这里我用的工具是jni4net 0 8 8 0 Visual Studio2015 一 编写C 类库
  • [人工智能AI]之贝叶斯网络

    人工智能AI 之贝叶斯网络 Bayesian network 部分图片和来源自 NJU 人工智能 高阳教授 的课件 通俗地讲 贝叶斯网络就是用一组有向无环图 表示多个事件的因果依赖关系 并借此完成相关推理计算 1 贝叶斯定理 条件概率 这里
  • linux服务器上部署多个vue项目(使用相同的ip(域名)及端口号)

    linux服务器上部署多个vue vue2 0 项目 使用相同的ip 域名 及端口号 1 首先想要实现的效果为 http ip 端口号 a 注 a代表a项目 http ip 端口号 b 注 b代表b项目 2 linux的文件路径为 3 此时
  • Qt迭代器(Java类型和STL类型)介绍

    一 介绍 遍历一个容器可以使用迭代器 iterators 来完成 迭代器提供了一个统一的方法来访问容器中的元素 而Qt的容器类提供了两种类型的迭代器 Java风格迭代器和STL风格迭代器 二 Java 类型迭代器 对于每个容器类 有两个 J
  • 【不定期更新-优化专题】

    文章目录 前言 一 学习资料类 前言 目前正在学习中 该专题主要用于分享自己的学习路线 工具 笔记等 欢迎交流与指正 一 学习资料类 视频 https www bilibili com video BV1Jt411p7jE 书籍下载 htt
  • VS:让程序运行完后不直接关闭

    Issue 控制台一闪而过 看不到输出结果 如何保持控制台窗口 让程序运行完后不直接关闭 Solve 1 推荐 建议设置项目属性 1 右键项目 gt gt 属性 Properties 打开项目的属性页 2 项目的属性页下 找到 配置属性 C
  • SQL语句优化问题

    有时返回数据时 需要有三张或以上的表需要查询 一张表的数据往往需要连接多张 效率非常的差 SELECT user id user uuid user user name AS username user login name name us
  • 测试项目:车牌检测,行人检测,红绿灯检测,人流检测,目标识别

    本项目为2020年中国软件杯 组第一批赛题 基于计算机视觉的交通场景智能应用 项目用python实现 主要使用YOLO模型实现道路目标如人 车 交通灯等物体的识别 使用开源的 中文车牌识别HyperLPR 项目实现车牌识别功能 github
  • OpenWRT UCI介绍及相关处理库

    OpenWRT UCI介绍及相关处理库 文章目录 OpenWRT UCI介绍及相关处理库 1 前言 2 概念 3 UCI配置文件 4 文件语法 5 命令行实用工具 5 1 用法 5 2 示例 导出整个配置 查看所有配置项的值 查看特定选项的
  • [Dotween] 介绍与使用,和坑

    Dotween 是在unity里实现各种动画效果 比如 位移 transform DoMove 旋转 transform DoRotation 缩放 transform DoScale 颜色改变 image DoColor 延时调用 Dov
  • QT中的QVariant类型-万能变量

    转自 https blog csdn net xiaopei yan article details 81410092 前言 QVariant这个类很神奇 或者说方便 很多时候 需要几种不同的数据类型需要传递 如果用结构体 又不大方便 容器