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; }
标签:QVariant,qmap,qDebug,student,类型,qt From: https://www.cnblogs.com/baisedeyu/p/17870434.html