2016-08-05 14 views
3

私は同じ名前の2つの信号が2つの異なった信号から来ています。classesABclass Cです。 void SomeSignal()は、引数なしのclass Aの信号です。別のクラスの別の信号void SomeSignal(int)があります。QTでは、同じ名前で異なる引数を持つ2つのスロットを使用できますか?

class Cでは、これらの信号を2つの異なる方法で処理する必要があります。 2つのスロットvoid SomeSignal()void SomeSignal(int)class Cにできますか?

答えて

6

はい有効です。しかし、これを行う場合は、Qt 5接続構文を使用する場合、通常の方法とは異なる方法で信号/スロットへの接続を処理する必要があります。

connect(a, &A::SomeSignal, this, static_cast<void (C::*)(void)>(&C::SomeSlot)); 
connect(b, &B::SomeSignal, this, static_cast<void (C::*)(int)>(&C::SomeSlot)); 

をそれとも、Qtの5.7を使用している場合qOverloadヘルパー関数を使用します。簡単に言えばそうconnecting to overloaded signals and slots

を処理する方法の

次の質問を見て、答えは、のように接続します。

編集:@TobySpeightとして明示的なテンプレート引数を使用するには、以下の指摘:1スロットが過負荷になっているので、接続するために、両方のテンプレート引数を指定する必要がありますように

QObject::connect<void(A::*)(), void(C::*)()>(&a, &A::SomeSignal, &c, &C::SomeSlot); 
QObject::connect<void(B::*)(int), void(C::*)(int)>(&b, &B::SomeSignal, &c, &C::SomeSlot); 
  • 思えます。
+1

メンバのポインタを 'static_cast'よりも明示的なテンプレート引数を' connect <>() '](/ a/37302949)に与える方が安全だと思います。 –

+0

@TobySpeight私はこの構文を知らなかった、ありがとう。 'QObject :: connect'の実装を見ると、それがどのように推測できるのか分かりますが、特に[QObject :: connect()](http:// doc)のドキュメントを見ると、文書化されていないようです。 qt.io/qt-5/qobject.html#connect-3)(ドキュメントはテンプレートの使用を隠しています) –

1

はい、可能ですが、全く異なるクラスから来ている別のものを扱っている場合は、これらのスロットの名前を別々にする方がはっきりしています(信号名とリンクされたスロット名の間には関係がないことに注意してください)。

+0

ありがとう@Matteo Italia。 – skyaakash

+1

これは単に過負荷です。 –

関連する問題