2016-10-10 27 views
0

キューに入れられた信号にカスタムタイプを使用している場合。 カスタムタイプを登録する正しい手順は何ですか?qRegisterMetaTypeを呼び出す前にQ_DECLARE_METATYPEを呼び出す必要がありますか?

qRegisterMetaTypeの前にQ_DECLARE_METATYPEに電話する必要がありますか?

キューに登録された信号はカスタムタイプを登録する必要がありますが、直接信号は登録しないのはなぜですか?

+1

1.はい、必要です。 2.キューに入れられた接続は、いくつかの追加のランタイム初期化と、引数のディープコピーを行う必要があるため。 Btw、あなたは '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で提供される機能が必要な場合は、それを使用する必要があります。

関連する問題