zoukankan      html  css  js  c++  java
  • QVariant的用法

    https://blog.csdn.net/xiaopei_yan/article/details/81410092

    前言

    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、QSizeQString,并且还有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*>();

    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();
  • 相关阅读:
    滚轮选择器效果 封装类
    我的第一个博客——Fragment遇到的问题
    LeetCode#11 Container With Most Water
    LeetCode#5 Longest Palindromic Substring
    LeetCode#3 Longest Substring Without Repeating Characters
    邮件协议
    六、应用层——文件传输协议FTP
    六、应用层——DNS
    平衡二叉树
    二叉树的性质
  • 原文地址:https://www.cnblogs.com/sggggr/p/13889515.html
Copyright © 2011-2022 走看看