5、QVariant
QVariant,被称为万能数据类型,实际上它是类似C++的联合union类型。简单的说自定义性能强就像一个盒子几乎可以让你放任意的qt类型,同时可以轻松构造任意类型的任意复杂数据结构,但请注意复杂类型意味着性能和效率的让步。
qt6在文档中如下描述:
由于C++禁止联合union包含具有非默认构造函数或析构函数的类型,这会导致好多继承的类qt类不能在联合中使用。如果没有 QVariant,这对 QObject::property()和数据库工作等来说将是一个问题,故引入该类型。
QVariant支持常见类型
它几乎支持常见的qt中所有类型,在使用过程中就可以轻松的保存很多类型的值,有点类似盒子,尽管放就行。
QMap<QString,QVariant> qmap; qmap["int"]=100; qmap["double"]=100.00; qmap["string"]="Good"; qmap["color"]=QColor(255,255,0); //输出:转换函数来处理 qDebug() << qmap["int"] << qmap["int"].toInt(); qDebug() << qmap["double"] << qmap["double"].toDouble(); qDebug() << qmap["string"] << qmap["string"].toString(); qDebug() << qmap["color"] << qmap["color"].value<QColor>(); //创建一个字符串列表QStringList qDebug() << endl; QStringList qsl; qsl<<"a"<<"b"<<"c"<<"d"; QVariant qvsl(qsl); if(qvsl.type()==QVariant::StringList){ QStringList qlist=qvsl.toStringList(); for (int i = 0; i < qlist.size(); ++i) { qDebug() << qlist.at(i);//输出列表数据 } }
支持自定义类型
//定义学生结构体类型 struct student{ int iNo; QString strName; int score; }; Q_DECLARE_METATYPE(student)
//结构体类型和QVariant类配合使用 qDebug() << endl; student stu; stu.iNo=202203; stu.strName="sunny"; stu.score=588; //使用静态方法保存数据 QVariant qstu=QVariant::fromValue(stu); if(qstu.canConvert<student>()){ //判断是否可以转换操作 student temp=qstu.value<student>();//获取数据 student qtemp=qvariant_cast<student>(qstu); qDebug() << "student:iNo="<<temp.iNo<<";strName="<<temp.strName; qDebug() << "student:iNo="<<qtemp.iNo<<";strName="<<qtemp.strName; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧