Q_DECLARE_METATYPE 和 qRegisterMetaType 的区别

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。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容