シグナルとスロットのデバッグは、シグナルが発行されたときにデバッガーがシグナルのスロットにジャンプしないため、難しい場合があります。Qt シグナルとスロットをデバッグするためのベスト プラクティスは何ですか?
特に
- 接続が正常にセットアップされていることを確認するにはどうすればよいですか?
- いつシグナルとスロットを使用する必要がありますか? また、いつそれらを避けるべきですか?
- あなたの経験から、最も効率的なデバッグ手法は何ですか?
シグナルとスロットのデバッグは、シグナルが発行されたときにデバッガーがシグナルのスロットにジャンプしないため、難しい場合があります。Qt シグナルとスロットをデバッグするためのベスト プラクティスは何ですか?
特に
Qt シグナルとスロットをデバッグする 20 の方法と呼ばれる、しばらく前に書かれたブログ投稿がありました
。
#2については、シグナル/スロットはGUIフレームワークのかなりコアな概念であるため、シグナル/スロットを使用する、または使用しないという明確な理由があるとは思いません。シグナルは、あるコンポーネントの知識を別のコンポーネントに分離するのに最適な方法であり、状態の変化や通知を宣言するだけの再利用可能なウィジェットを設計できます。また、メイン スレッドが認識できるシグナルを発行することにより、非 GUI スレッド ループから GUI の変更を伝達するための非常に優れた方法でもあります。
親ウィジェットが多数の子ウィジェットのイベント フィルターになる場合など、シグナル/スロットの代わりにイベントを使用することが本当に必要な場合があります。子は親について知る必要はなく、親はシグナル接続ではなく、より直接的なイベントを取得します。
同じトピックのイベントで、子 -> 親 -> 祖父母 -> などからのイベントのバブルアップが本当に必要な場合があります。信号は、決定する方法として意図されていないため、ここではあまり意味がありません。提案されたイベントがアクションをもたらすかどうか (明らかにこのように使用できます)。イベントを使用すると、現在の状態を確認したり、このウィジェットが何かを行う必要があるかどうかを判断したり、他の誰かが検査できるようにチェーンをバブルアップしたりできます。
The Difference Between Signals/Slots and Eventsについて本当に素晴らしい答えがあります。ここに良いスニペットがあります:
- あなたはイベントを「処理」します
- 信号の放出について「通知を受ける」
この引用で私が気に入っているのは、さまざまなニーズ ケースが説明されていることです。ウィジェットでアクションを処理する必要がある場合は、おそらくイベントが必要です。起こっていることの通知を受け取りたい場合は、おそらくシグナルが必要です。
接続が正常にセットアップされていることを確認するにはどうすればよいですか?
失敗した接続ごとに、アプリケーションからのコンソール出力に警告が表示されます。
いつシグナルとスロットを使用する必要がありますか? また、いつそれらを避けるべきですか?
私の意見では、クラス設計で関心の分離を維持したい場合はいつでも、これらを使用しても問題ありません。あなたのクラスは、あなたのクラスにとって完全に未知の別のクラス (または複数のクラス) によって応答されるかもしれないし、されないかもしれないシグナルを発することができます。これにより、結合が抑えられます。
あなたの経験から、最も効率的なデバッグ手法は何ですか?
このブログ投稿で述べられている以上のことは何も追加できません。Qt シグナルとスロットをデバッグする 20 の方法
#1 については、上記または参照されているブログ投稿に記載されていない別の情報を追加します。
のドキュメントからQObject::connect()
:
送信側オブジェクトのシグナルから受信側オブジェクトのメソッドへの指定されたタイプの接続を作成します。接続が成功した場合は true を返します。それ以外の場合は false を返します。
特にすべての Qt プログラムにコンソール出力があるわけではないため、接続が成功したことを確認するために、接続の戻り値をアサートすることを好みます。これにより、後日シグナルまたはスロットのいずれかに加えられた変更をキャッチし、変更を行ったプログラマーに接続も更新させるため、コードの保守が容易になります。