2013-06-13 8 views
6

のQObject ::接続:私はこれを実行しようとしました型の引数をキューイングすることはできません「INT&」

connect(this, SIGNAL(signalClicked(int&)), classA, SLOT(doWork(int&))); 

しかし、私はタイトルにメッセージが表示されます。 は、だから私は、インターネットを探索していると私はaswellに動作していないこの解決策を考え出した:

qRegisterMetaType<int&>("Type"); 
connect(this, SIGNAL(signalClicked(Type)), classA, SLOT(doWork(Type))); 

(エラー:への呼び出しに該当する関数「qRegisterMetaType(のconstのchar [5])」)

すべてのソリューション? ご協力いただきありがとうございます。

+0

##を含むですか? – Angew

+0

はい、私はそれを得ないのです。 – Thibel

+0

あなたの答えをありがとうが、私はすでにこの解決策を見つけました。http://www.qtforum.org/article/36440/signal-between-threads.html ?s = e3808660493121294f8780ef018f9b5e98f5b6f4と残念ながらまだ動作していません。 – Thibel

答えて

11

Qtがスレッド間の接続を意味する引数をキューに入れようとしている場合。これは非const参照では機能しません。

これを回避するにはreference_wrapperを使用できますが、私はあなたのデザインを再考することを強く推奨します。信号/スロット接続でのリファレンス値の受け渡しはお勧めできません。

+0

私はそれを行うのは良い方法ではないことを知っていますが、私はこれに新しいです、それは私が見つけた唯一の解決策です。実際に私が達成しようとしているのは、メインスレッドの属性を更新し、無限ループの別のスレッドからその属性を読み取ることです。 – Thibel

+1

@ Dan-MilburnでもQtがオブジェクトをコピーするので、あなたが提案したことを試してみましょう。値を参照するのはどうしていいのですか? – TheDarkKnight

+0

Qtがコピーを取る場合、(非const)参照渡しのポイントは何ですか?受信側のスロットは、とにかくオリジナルを変更することはできません(間違っていると思うようになります)。さらに、Qt信号/スロットの背後にある点は、信号エミッタが何に接続されているか、またはそこにいくつの接続があるかを知らないことである。接続されたスロットが2つあり、両方が参照によって渡されたオブジェクトを修正しようとすると、バグの可能性があります。限られた状況では、キューに入れられていない接続でも動作しますが、それでも設計は悪いです。 –

関連する問題