宏Q_DECLARE_METATYPE
定义了偏特化的QMetaTypeId
,QMetaTypeId
会调用qRegisterMetaType
进行注册,但并没有立刻调用它,当第一次调用的时候,才会调用qRegisterMetaType
注册。在没注册之前,这些class的实例还不能放入消息系统进行传递。所以,最好在入口函数里用qRegisterMetaType
对消息中要使用的class类型进行事先的注册,才能避免运行时的错误。
源码:
template <>
struct QMetaTypeId< TYPE >{
static int qt_metatype_id(){
...
const int newId = qRegisterMetaType< TYPE >(#TYPE,reinterpret_cast< TYPE *>(quintptr(-1)));
...
}
};
所以,在入口函数通过
qMetaTypeId<foo>();
也可以间接调用qRegisterMetaType
进行注册名称为foo的class。