2016-10-10 63 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提供的功能,您將不得不使用它。

相關問題