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)

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*>();

(4)还有种写法,用QVariant的构造函数QVariant(int typeId, const void copy)。虽然不常用,特别是指针类型,即 QMetaType::VoidStar,和 QMetaType::QObjectStar,一般还是用fromValue。但是还是以存取QObject为例补充下吧,

起码知道写法。

QObject* obj=new QObject;
    obj->setObjectName("myObj");

    //保存
    QVariant var=QVariant(QMetaType::QObjectStar,&obj);

    //提取
    QObject* myobj=qvariant_cast<QObject*>(var);
    if(myobj!=NULL)
        qDebug()<<myobj->objectName();

    obj->deleteLater();

结束语

程序中有很多小点,存储着很大的智慧,就如QVariant就是如此。





原文链接: https://www.cnblogs.com/xdl824/p/14888984.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/211446

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月13日 上午12:48
下一篇 2023年2月13日 上午12:49

相关推荐