前言
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支持的类型,可直接赋值,但是取值时,对于存入的是什么类型,取出也要为这个类型。
QVariant var;
(12);
int data=();
或
QVariant var=12;
int data=();
(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;
=0;
=QString("LiMing");
data[0]=QString("ddd");
data[1]=123;
data[3]=QVariant::fromValue(myClass);
//获取数据
QString str=(0).toString();
int val=(1).toInt();
if(data[3].canConvert<MyClass>())
{
MyClass myClass=data[3].value<MyClass>();
int id=;
QString name=;
}
(3)对于不支持的C++基础数据类型,如 short char,先通过toInt()转化为int类型,然后再将int转为其原本的数据类型。
//-------------------------------char--------------------------
//char -> QVariant
QVariant var='B';
qDebug()<<var; //QVariant(int, 66)
// QVariant ->char
char channel=();
//------------------------------short--------------------------
//short -> QVariant
short dataType=12;
QVariant var2=dataType;
qDebug()<<var2; //QVariant(int, 12)
//QVariant -> short
short temp=(short)();
(4)保存指针,感觉这个比较强大,也比较容易用到。如
//保存
QVariant var=QVariant::fromValue((void*)event);
//获取
QPaintEvent* e=(QPaintEvent*)<void*>();
(5)还有种写法,用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();
(6) QVariant与json之间的各种转换
QVariant与Json的各种纠葛——Qt_十年之少的博客-****博客
警告:不要盲目的随便使用QVariant之类,它比较消耗内存和影响处理速度!!!
结束语
程序中有很多小点,存储着很大的智慧,就如QVariant就是如此。