1. Q_DECLARE_METATYPE(type)
1.1 应用范围:当需要再QVariant中自定义一个type时,需要使用Q_DECLARE_METATYPE(type)为type提供一个public 默认构造函数, public 拷贝构造函数和public 析构函数,并使QMetaType识别type。
1.2应用方法:理想情况下,需要将该声明放在一个类或结构体声明之后。如果无法这样做,还可以定义一个私有头文件,每次使用type时都需要包括该头文件。
如果想要将type用于queued signal和slot connections或者QObject的属性系统,还必须使用qRegisterMetaType(),因为type名称是再运行时解析的。后面这种方法在qml文件中链接C++类时经常用到。
// 声明方式
struct MyStruct
{
int i;
...
};
Q_DECLARE_METATYPE(MyStruct)
// 或者
namespace MyNamespace
{
...
}
Q_DECLARE_METATYPE(MyNamespace::MyStruct)
// 应用方法
MyStruct s;
QVariant var;
var.setValue(s); // copy s into the variant
...
// retrieve the value
MyStruct s2 = var.value<MyStruct>();
若希望自定义类type具备stream操作,则应该在type类的定义中重载相关操作符
QDataStream &operator<<(QDataStream &out, const MyClass &myObj);
QDataStream &operator>>(QDataStream &in, MyClass &myObj);
2. template <typename T> int qRegisterMetaType()和template <typename T> int qRegisterMetaType(const char *typeName)
2.1 应用范围:调用该函数来注册类型T,T必须通过Q_DECLARE_METATYPE()返回meta type 的id
// 示例#1
int id = qRegisterMetaType<MyStruct>();
// 示例#2
qRegisterMetaType<MyClass>("MyClass");
// 示例#3
typedef QString CustomString;
qRegisterMetaType<CustomString>("CustomString");