尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

3.1.7.Qt容器大家族(3):QVariant——万能盒子
📅 发布时间:2026/7/30 2:41:58

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!厉害吧?

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

相关新闻

  • 国内专业的冷焊机定制厂家推荐,水冷电火花堆焊机/冷焊机/精密模具修补机/金属缺陷修补机,冷焊机实力厂家推荐 - 品牌推荐师
  • 模型评测的未来:自动化、标准化、场景化三化趋势
  • 机房断网怎么装服务?Nginx 源码编译 + 自建内网 yum 仓库从零手把手教学

最新新闻

  • 企业如何防泄密?6 大企业防泄密方法,给企业加上 “安全锁”!
  • Conda环境下安装本地requirements.txt:三步解决Python依赖管理难题
  • 西门子PLC SCL编程实战:从梯形图进阶到结构化控制语言
  • 终极串口调试工具SuperCom:如何快速解决嵌入式开发的5大通信难题
  • Anaconda与Conda虚拟环境:Python项目环境隔离与管理的完整指南
  • TypeScript 7.0 Go语言重写编译器:10倍性能提升架构解析

日新闻

  • 终极TeamSpeak3音乐机器人搭建指南:5分钟实现语音聊天室音频播放
  • 广州海珠区内搬家攻略,平价靠谱搬家服务商推荐,专业打包搬运省心避坑全流程指南 - 厚道搬家
  • 大语言模型入门指南:从零到精通掌握AI核心技术的5大步骤

周新闻

  • 大连理工大学与东京大学联手打造的“主动型AI助手“
  • 170.2026年国家级科研瓶颈:超精密单点金刚石切削(SPDT)光学表面生成
  • SongBloom:革命性歌曲生成框架深度解析——如何通过交织自回归与扩散模型创作完整音乐

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号