web-dev-qa-db-ja.com

Qtシグナルとスロットが2回接続されている...どうなりますか?

同じ信号とスロットを2回接続するとどうなりますか?

メカニズムはどのように処理されますか?

49
itapadar

数週間前、インターンが誤って信号をスロットに2回以上接続していた。ある条件では、スロットを信号に接続し、別の条件では信号を切断するという考えでした。モードを変更したら、適切な作業を行います。

まあ、彼は適切なときに切断するのを忘れていました。したがって、モードを変更するたびに、スロットへの新しい接続がありました。

最終結果は? 1接続==スロットへの1コール。 2接続==スロットへの2コール。 3接続==スロットへの3回の呼び出しなど。これらの呼び出しは「同時に」発生しました(実際には同じイベントスレッド上にあるため、実際には発生しませんでしたが、すべての呼び出しが連続して処理されたということです)。

@Jobが彼のコメントの1つで指摘しているように(彼は信用に値するので、彼の仕事に賛成しないでください) Qt::UniqueConnection はこの問題を防ぎます。

49
San Jacinto

通常悪いこと。スロットを2回以上接続することは完全に許容されますが、信号が発生すると、接続ごとにスロットが呼び出されます。

複数の接続があることは必ずしも間違っていないことに注意してください。 (おそらく)完全に有効な用途があります。それらは非常にまれであり、私が機能としてこれを使用したことは決して考えられません。複数の接続があったことを思い出すことができるすべての状況は、意図されたものではなくバグであることが判明しました。

7
Troubadour

スロットは複数回実行されます(他の人がすでに言ったように)。

その他のメモ:

  • 以前は、以前に接続があった可能性がある場合の「1回だけ接続」のパターンは、最初に接続解除を呼び出し、次に接続して1つの接続のみを強制することでした。
  • 現在、4.6以降、よりエレガントなQt :: UniqueConnectionもあります。詳細は http://doc.qt.io/qt-5/qt.html#ConnectionType-enum をご覧ください
5
Frank Osterfeld