Qt

Q_DECLARE_METATYPE 和 qRegisterM

2022-03-06  本文已影响0人  左图右码

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。

上一篇 下一篇

猜你喜欢

热点阅读