官方解释:
当自定义一个结构体时,会使用到Q_DECLARE_METATYPE这个宏。
这个宏是为了让QMetaType知道Type这个数据类型,并提供一个默认的拷贝构造函数和析构函数。添加Q_DECLARE_METATYPE()可使所有基于模板的函数(包括QVariant)都知道该类型。
一般把这个宏放在结构体或类的末尾,或者放在一个专用的头文件中,每次在QVariant中使用该类型时都必须包含该文件。
官方例子
典型用例:
struct MyStruct
{
int i;
...
};
Q_DECLARE_METATYPE(MyStruct)
如果MyStruct位于命名空间中,则Q_DECLARE_METATYPE()宏必须位于命名空间之外:
namespace MyNamespace
{
...
}
Q_DECLARE_METATYPE(MyNamespace::MyStruct)
由于MyStruct已经注册,因此可以在QVariant中使用:
MyStruct s;
QVariant var;
var.setValue(s); // copy s into the variant
...
// retrieve the value
MyStruct s2 = var.value<MyStruct>();
使用例子
#ifndef MYTYPE_H
#define MYTYPE_H
#include <QObject>
#include <QMetaType>
class MyType{
Q_OBJECT
public:
MyType();
struct MyStruct
{
int width;
int height;
};
};
Q_DECLARE_METATYPE(MyType::MyStruct)
#endif // MYTYPE_H