当前位置: 首页 > news >正文

3.1.7.Qt容器大家族(3):QVariant——万能盒子

1.内容介绍

前几节课的容器课,我们讲解了QList、QString和QStringList,它们都有一个共同点:存什么类型,就得声明什么类型。

但是这时候,如果我们需要一个能装任意类型的容器,比如表格里的一行数据,可能包含各种类型的信息,比如int、double、QString等等等等,这时候要怎么办呢?

我们就要邀请我们的老四登场啦!它就是我们今天要讲的——QVariant!

2.讲解QVariant

1.什么是QVariant?

QVariant嘛,简单来说,它是一个万能盒子,什么类型都能往里面装,要装也很容易,直接赋值就行,和普通变量赋值一模一样!

QVariant v1 = 42; //int QVariant v2 = 3.14; //double QVariant v3 = "Hello"; //QString QVariant v4 = QColor(255, 255, 255); //QColor,存储颜色,这个以后会讲

当然,我们也可以用fromValue函数来存储。

QVariant var = QVariant::fromValue(QColor(255, 255, 255));

不管是int、double,还是Qt的类型,甚至是你自己的类型,它都能装进去!

当然,装进去就得取出来,怎么取出来呢?

2.怎么把数据取出来?

装进去很容易,取出来时我们要告诉这个万能盒子“要取出来什么类型”。

很多的常见类型,Qt都帮你写好了转化的函数,像是toInt啊,toDouble啊,toString啊,Qt都搞好了,当然,有些类型Qt没写好,我们就要用模板函数value了,比如QColor啊,QFont什么的。(以后都会讲到)

int a = v1.toInt(); // 取出 int double b = v2.toDouble(); // 取出 double QString c = v3.toString(); // 取出 QString QColor d = v4.value<QColor>(); // 取出 QColor //这里就需要模板函数value了,因为QColor没有专门的方法,Qt总不能把所有的都写一个方法吧

我们这里有一个注意事项,转化的类型不匹配不会报错或者抛出异常,但是可能会返回一个空值。(比如0或空字符串)

看到了吗?QVariant很聪明,会尽量帮你完成类型转化。

那么,QVariant有什么用呢?

3.有什么用?

QVariant最常用的场景就是用在表格控件,一行会有多种数据,类型不同,所以QVariant就是一个很好的选择。

还有信号槽传参、配置文件读写什么的,QVariant都有它的用武之地。

那你可能就会问了,自己的类型能不能传递呢?

4.能不能传递自己的自定义类型?

当然可以!只不过你需要一个小操作,就是注册。你需要用一个叫做Q_DECLARE_METATYPE的宏去注册一下这个类型,如果不注册的话,QVariant就不会认识你这个类型,取出来的时候就会有问题。

#include <QMetaType> //要用这个头文件 struct Student { QString name; int age; }; Q_DECLARE_METATYPE(Student) // 注册 // 装进去 Student s{"小明", 18}; QVariant v = QVariant::fromValue(s); // 取出来 Student s2 = v.value<Student>();

QVariant我们就讲完啦!是不是非常简单呢?对了,你们有没有发现,这几节课我都没有让你们写头文件,这是为什么呢?因为它们根本不用写头文件!为什么不用写头文件呢?因为这些容器的头文件都被Qt的控件给用烂了!绝对会包含它们!就连QObject都会用到!所以我告诉你们,QObject的属性系统传递的就是QVariant!厉害吧?

好啦,这节课就到这里,我们下节课再见,拜拜!

http://www.jsqmd.com/news/1291027/

相关文章:

  • GTO、GTR、MOSFET、IGBT四大功率半导体核心区别与选型实战指南
  • 国内专业的冷焊机定制厂家推荐,水冷电火花堆焊机/冷焊机/精密模具修补机/金属缺陷修补机,冷焊机实力厂家推荐 - 品牌推荐师
  • 机房断网怎么装服务?Nginx 源码编译 + 自建内网 yum 仓库从零手把手教学
  • 模型评测的未来:自动化、标准化、场景化三化趋势
  • VTK+Qt最小示例:打通C++三维可视化开发环境与核心集成
  • 2026年GEO信源发稿平台推荐:4大主流平台5大核心维度对比与选购指南
  • Nginx安装配置与性能优化全指南
  • 开题报告拿高分的秘密[特殊字符]这才是高校认可的标准开题
  • 7月内核调优路线图——从单点参数到场景化自动配置演进路径
  • mall-项目redis三剑客
  • Word图片批量导出并插入Excel的自动化方案
  • 数据团队 OKR 制定指南:从“做了多少报表“到“带来了多少增长“
  • 一个9年网安人的自白:30岁转行晚吗?从安服到架构师的转型之路(附完整学习路线图)
  • 幻兽帕鲁存档编辑器:3步轻松掌握游戏数据转换与编辑技巧
  • 2026 年 7 月新发布:德阳优秀的三元锂电池回收优质厂家怎么联系,你家淘汰的旧电动车锂电池,居然能值好几千?千万别乱卖,这门道可太黑! - 实业推荐官【官方】
  • 抖音小店一件代发如何做好商品管理?滞销品优化思路 - 抖掌柜
  • SPF实验动物质量控制与青岛中心应用指南
  • 华硕笔记本性能革命:3步实现轻量级硬件控制中心终极指南
  • STM32串口通信全解析:从TTL电平到USB转串口模块实战
  • 哨兵卫星数据批量下载实战:Python自动化流程与避坑指南
  • 《超限销金之城》10分钟单刷帅杰克:局外插件与局内BD组合攻略
  • Dijkstra算法与城市最短路问题详解
  • 传统文化 AI 化的趋势判断:从辅助工具到创意伙伴
  • 如何永久免费激活IDM:3种简单方法完整指南
  • Opus 5与Codex语音模式:AI多模态工作流开发实战指南
  • 深入解析BERT:从Transformer原理到实战微调与部署优化
  • 7月开源贡献路线图——从PagedAttention PR到推理框架调优指南
  • 2026 年更新:吉林专业的乌桕树品牌深度剖析,那棵被误认成乌桕树的老桩,藏着江南人几代人的秘密? - 企业推荐官【认证官方】
  • 心里发紧时听《正义的呼唤》
  • 数据仓库(数仓)核心架构、建模实战与典型应用场景全解析