QVariant的用法

前言

QVariant这个类很神奇,或者说方便。很多时候,需要几种不同的数据类型需要传递,如果用结构体,又不大方便,容器保存的也只是一种数据类型,而QVariant则可以统统搞定。


介绍

帮助文档上说:The QVariant class acts like a union for the most common Qt data types.。


QVariant 这个类型充当着最常见的数据类型的联合。QVariant 可以保存很多Qt的数据类型,包括QBrush、QColor、QCursor、QDateTime、QFont、QKeySequence、 QPalette、QPen、QPixmap、QPoint、QRect、QRegion、QSize和QString,并且还有C++基本类型,如 int、float等。


当然,如果支持的类型没有想要的,没关系,QVariant也可以支持自定义的数据类型。被QVariant存储的数据类型需要有一个默认的构造函数和一个拷贝构造函数。为了实现这个功能,首先必须使用Q_DECLARE_METATYPE()宏。通常会将这个宏放在类的声明所在头文件的下面:


Q_DECLARE_METATYPE(MyClass)


示例


(1)支持的类型。

对于QVariant支持的类型,可直接赋值,但是取值时,对于存入的是什么类型,取出也要为这个类型。如存入为int类型,输出为toString()

QVariant var;
var.setValue(12);
int data=var.toInt();

QVariant var=12;
int data=var.toInt();

(2)对于不支持的类型

,如自己定义的结构体。由于Qt都是基于元对象系统,故要在头文件里面要注册此类属于元类型。存储用到了QVariant QVariant::fromValue(const T &value) 或 void QVariant::setValue(const T &value)。获取用到了

T QVariant::value() const,在这之前一般要bool QVariant::canConvert(int targetTypeId) const先用进行判断,是否可以转换。例子如下:


.h文件声明

struct MyClass{
int id;
QString name;
};
Q_DECLARE_METATYPE(MyClass)

.cpp文件定义

//存储数据
    MyClass myClass;
    myClass.id=0;
    myClass.name=QString("LiMing");
 
    data[0]=QString("ddd");
    data[1]=123;
    data[3]=QVariant::fromValue(myClass);
 
 
//获取数据
    QString str=data.value(0).toString();
    int val=data.value(1).toInt();
 
    if(data[3].canConvert<MyClass>())
    {
        MyClass myClass=data[3].value<MyClass>();
        int id=myClass.id;
        QString name=myClass.name;
    }

(3)保存指针

,感觉这个比较强大,也比较容易用到。如

//保存
QVariant var=QVariant::fromValue((void*)event);
//获取
QPaintEvent* e=(QPaintEvent*)var.value<void*>();


来一段示例代码:

//一.基本数据类型

QVariant number(27); //定义一个名为number的QVariant变量,并初始值为27,那么在这里相当于int型
    qDebug()<<number;//打印结果:QVariant(int, 27)
    qDebug()<<number;

 QStringList strList;
    strList.append("who");
    strList.append("are");
    strList.append("you");

    QMap<QString,QVariant> myMap;
    myMap.insert("one",45); //int
    myMap.insert("two","hello"); //qstring
    myMap.insert("three",QColor(0,0,0)); //qcolor
    myMap.insert("four",strList); //QStringList 类型,就是所谓的容器类型值
    //    myMap.insert("five",map); //尝试了一下,结果这里无法转化,可能是不支持这种数据类型吧,map为QMap类型
    QMapIterator<QString,QVariant> x(myMap);
    for(;x.hasNext();)
    {
        qDebug()<<x.key()<<x.next().value();
#if 0
        if(x.next().value().type() == QVariant::StringList) //判断QVariant类型,这里是判断是否为QStringList,更多的可以找手册查询一下
        {
            //           qDebug()<<x.key();
            QString str=QString("%1").arg(x.key()); //找到数据类型为QStringList的值对应的键,再通过键找到值,这里不能直接用x.next().value(),因为next会跳到下一个键值对
            qDebug()<<str;
            QStringList myList=myMap[str].toStringList(); //必要的转化
            for(int m=0;m<myList.size();m++) //遍历QStringList
            {
                qDebug()<<myList[m];
            }
        }
#endif
        //        qDebug()<<x.next().value().type();
    }

//二.自定义数据类型
因为自定义数据类型是系统中不存在的,即使创建,也需要注册一下,方便编译器识别

struct myStruct //自定义的数据类型
{
    int age;
    char name[10];
};
Q_DECLARE_METATYPE(myStruct)  //注册,必不可少

//上面这部分代码一般在头文件中完成

//    myStruct stu=  //结构体初始化
//    {
//        100,
//        "wangLei"
//    };
    myStruct stu;
    stu.age = 100;//也可以先定义变量后这样赋值
    strcpy(stu.name,"Hello./n");

    QVariant v;
    v.setValue(stu); //设置QVariant的值
    qDebug()<<"v:"<<v;

    myStruct s; //这部分代码主要是将QVariant类再转化为myStruct类,其他QVariant类转化成其他类也可用这种方法
    s=v.value<myStruct>();
    qDebug()<<"s:"<<s.age<<s.name;


————————————————

版权声明:本文为CSDN博主「十年之少」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/xiaopei_yan/article/details/81410092



本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年4月    »
1234567
891011121314
15161718192021
22232425262728
2930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864