在调用qRegisterMetaType之前,我是否必须调用Q_DECLARE_METATYPE?

时间:2016-10-10 12:49:36

标签: c++ qt

在排队信号中使用自定义类型的情况。 注册我的自定义类型的正确顺序是什么?

是否有必要在Q_DECLARE_METATYPE之前致电qRegisterMetaType

为什么我必须为排队信号注册自定义类型,而不是为直接信号注册?

2 个答案:

答案 0 :(得分:4)

  

是否有必要在qRegisterMetaType之前调用Q_DECLARE_METATYPE?

是的。 qRegisterMetaType上的Qt文档明确说:

  

T必须使用Q_DECLARE_METATYPE()声明。

你必须为排队信号注册你的自定义类型,因为通过注册它,Qt可以在它的事件循环(当然使用QVariant)中复制它并稍后将其作为参数传递(当原始传递的值很长时超出范围)。

答案 1 :(得分:3)

问题是胡说八道:Q_DECLARE_METATYPE不是电话。它定义了struct QMetaTypeId<TYPE>。显然,对qRegisterMetaType<T>(...)或任何其他可调用对象的调用不能声明在调用站点之外使用的类型。

因此,无论Q_DECLARE_METATYPE做什么都不能通过编写函数调用来完成。如果您需要Q_DECLARE_METATYPE提供的功能,则必须使用它。