Qt中QVariant是多种类型的联合,QVariant类中有个SetValue(T& value)方法,将自定义 T 类型的数据保存到QVariant对象中,能够理解为是自定义类型被封装成了QVariant的形式,这样,咱们自定义的T类型的对象就可以经过全部参数和返回值为QVarian类型传递。好比QTableWidgetItem的setData(int column,QVariant& data)和QTreeWidgetItem的setData(int column,int role,QVariant& data)等,经过setData函数咱们能够为每一个单元格保存本身想绑定的数据及为每一个树节点保存想绑定的自定义类型的数据。函数
可是,QVariant中的setValue方法的使用有个前提,就是咱们自定义的类型要能被Qt所识别。那该怎样识别呢?spa
这就要用到宏定义Q_DECLARE_METATYPE了,经过这个宏定义能够将自定义的类型注册到Qt的元类型中,从而被Qt识别,一般在自定义类型定义以后使用。指针
1 struct Test 2 { 3 int id; 4 QString name; 5 }; 6
7 Q_DECLARE_METATYPE(Test)
经过Q_DECLARE_METATYPE(Type)的形式来进行注册。须要注意的一点是当自定义的类或结构体在命名空间内时,须要在命名空间结束时指定命名空间。code
以下例中的A::Test对象
nameSpace A { struct Test { int id; QString name; }; } Q_DECLARE_METATYPE(A::Test)
今天遇到了莫名其妙的编译错误,缘由是我用QVariant设置一个自定义指针类型的Data,这时就须要Q_DECLARE_METATYPE(Type*)了,若是设置了Q_DECLARE_METATYPE(Type),Qt只能识别Type类型,而未能识别其指针类型!!!blog
另外自定义类型中必定要有默认构造函数,若是已经显式的定义了带有无默认参数的构造函数则须要另外写上默认构造函数 Test(){}。get
还有为保证不出其余莫名其妙的错误,最好在类定义的头文件中加上#include <QVariant>,保证编译器可以识别该宏。编译器