2016-07-22 4 views
5

ネットワーク経由でQt信号を送信したいと考えています。Qtのネットワーク上の信号/スロットのメカニズム

  • は、静的メソッド::fromSignal
  • を使用してqMetaMethodを作成し、メソッド名、パラメータ名、その型ID [1]し、作成したメタメソッドを使用して値を取得します:信号の呼び出しをシリアル化することはQtのメタタイプのシステムを使用して、非常に単純です。
  • すべてをあなたの好みのフォーマット(JSON、XML)にまとめて送信します。

しかし、これまでのところ、私はシリアル化されたデータを使用して信号を起動する方法を見つけ出すことができませんでした:QMetaObject::invokeMethod(..)は、文字列として、信号/メソッド名を取ります。問題は引数です:QGenericArgumentとして提供され、実際の型(文字列ではないか、typeId)と関連する値を必要とするQ_ARGマクロを使用することによってのみ作成できます。また、引数の数はコンパイル時に定義する必要があります。引数のリストを取るinvokeMethod(..)はありません。

何か不足していますか?または、これを行うためのより良い/代替方法がありますか?

[1]さらに質問:タイプがQ_DECLARE_METATYPE(..)を使用して登録されたときに常に同じタイプIDを取得するようにするにはどうすればよいですか?

+0

あなたは何も欠けていません。 –

+0

Er ....私は信号/スロットのメカニズムがネットワーク上で全部働くように設計されているとは思わない。私はこの点に関して自分自身が間違っていることを見てうれしいです。 –

+0

IMHO、ソケットに基づくIPCはキーであり、変換信号/スロットはちょうどピーナッツであり、IPCの異なる面で処理することが知られている信号とスロットを意味します。 – AlexanderVX

答えて

3

自分でQGenericArgumentを作成することはできません。あなたはしないように勧められますが、あなたがしようとしていることは、とにかく実装に依存していることです。それほど多くはありません:あなたは型名と与えられた型のデータへのポインタを提供します。例えば:

QGenericArgument one() { 
    static const char type[] = "int"; 
    static const int data = "1"; 
    return QGenericArgument{type, (void*)&data); 
} 

より、例えばコードのthis answerのイントロスペクションビジターを参照してください。

Q_DECLARE_METATYPE(..)を使用してタイプを登録するときに、常にタイプIDが同じになるようにするにはどうすればよいですか?

あなたはありません。型名を使用する必要があります。各プロセスは、型名をローカルで解決する必要があります。

あなた自身で実装したい場合を除き、MITライセンスのqt-remote-signalsのような準備が整ったものを使用してください。

+0

これまで以上にlibを使って作業しました。 QGenericArgument ctorを直接使用していたのは、推奨されていない唯一のものでした。 – Nils

+1

関連:http://stackoverflow.com/questions/7721923/calling-qmetaobjectinvokemethod-with-variable-amount-of-parameters – Nils

関連する問題