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

Do I have to call Q_DECLARE_METATYPE before calling qRegisterMetaType?

本文关键字:调用 DECLARE METATYPE 之前 qRegisterMetaType      更新时间:2023-10-16

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

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

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

For Qt5:

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

。qRegisterMetaType的Qt文档明确地说:

T必须用Q_DECLARE_METATYPE()声明。

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

Qt6

:

计划是能够从Qt 6.0开始不使用Q_DECLARE_METATYPE。但这还没有完全成功地实现。Qt 6.5应该按照这个邮件列表线程完成:https://lists.qt-project.org/pipermail/development/2022-July/042746.html

最后,题外话:Q_DECLARE_METATYPE实际上是不必要的是Qt 6的目标,但目前还不是这样。我认为这个bug最终应该在6.5中修复。

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

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