2016-10-10 60 views
0

在排队信号中使用自定义类型的情况。 注册我的自定义类型的正确顺序是什么?在调用qRegisterMetaType之前,我是否必须调用Q_DECLARE_METATYPE?

是否需要在qRegisterMetaType之前致电Q_DECLARE_METATYPE

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

+1

1.是的,这是必要的。 2.因为排队连接需要一些额外的运行时初始化并可能执行参数的深层副本。顺便说一句,你可以在'QVariant'中包装一个数据并将其用作参数 –

回答

4

是否需要在qRegisterMetaType之前调用Q_DECLARE_METATYPE?

它是。 qRegisterMetaType上的Qt文档明确指出:

T必须用Q_DECLARE_METATYPE()声明。

您必须先注册您的自定义类型排队信号,因为通过注册它,Qt可以在其​​事件循环使得它的副本(这当然使用的QVariant),并在以后通过作为参数(当原来传递的值已经超出了范围)。

3

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

所以,不管Q_DECLARE_METATYPE在做什么都不能通过写一个函数调用来完成。如果您需要Q_DECLARE_METATYPE提供的功能,您将不得不使用它。

相关问题