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;
    }
复制代码

 

posted @   秃头的C#  阅读(171)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示