するために使用され信号スロットがない
-
22-09-2019 - |
質問
まQtを使用するには、信号スロットとして 本当に 便利です。しかし、大きな権力には大きな責任だと思ってい便もご用意をおすすめします。
ある最高の実践のための信号スロット?私は困りの方も一般的なガイドラインにそうである。も質問してくれてありがとうございます明確な意見について、その全員が自分のチーム同意):
- としてお使いいただけます信号の報告を誤?
- しても大丈夫ですることができるものとし、信号処理するのですか?
- できる信号の使用を開始しています。E.g.
signal displayInfoScreen()
扱わなければならないようスロットを示す情報画面になります。
その他の意見が信号を/僕が使用されている 非常に 大歓迎です!
解決
これは、レポート
に信号を使用しても大丈夫です エラー?
はい、例えば、完了信号が状態を運ぶQFtpを参照。これは、実際のエラー、エラーが発生したという情報だけを運ぶことはありません。
これは、信号がすると仮定しても大丈夫です 処理される?
はありません。送信者は、しかし、特定のアプリケーションは、それに依存することができ、と仮定ことはできません。例えば、ファイル表すQAction - 新しい仕事への適用のために処理する必要があるが、QActionオブジェクトはあまり気にしませんでした。
。のCAN信号が開始するのに使用されます 行動?例えば。信号 displayInfoScreenは()によって処理されなければなりません スロットことを示す情報画面を表示する。
ここでも、そう、例えばQActionオブジェクト。しかし、あなたはコンポーネントを再利用できるようにしたい場合は、あなたが実際のクラスがそれに依存しないことを保証するように注意する必要があります。
他のヒント
シグナルとスロットは強力です。あなたは以前答えとして、信号が接続されたスロットを持っていると仮定することはできません。
シグナル/スロットベースの設計の主な欠点は、オブジェクトの1つのアクションがに接続されていることを他のオブジェクトの他のアクションをトリガーすることができますので、あなたがロジックの非常に簡単緩いトラックは、あなたが、を実装することができることのです信号が出射されます。望ましくない副作用、再帰呼び出しなどを持っている方がはるかに簡単です。
信号が処理されると仮定し、それはOKですか?
ありませんそうではありません。シグナルは、物事のファイア・アンド・フォーゲットタイプです。誰が信号に接続し、それがエミッタの懸念すべきではない何をするか。
は、それがOKレポートエラーに信号を使用するか?
はい、私は一般的に、これは状況に依存するだろう。エラーは非同期に発生する可能性がある場合は、そのようなことを示すために信号は間違いなく正しいです。クライアントコードは、ある一つの関数を呼び出すときにのみエラーが発生した場合、エラーは、その機能から、しない信号として応答しなければなりません。しかし、それはケースバイケースで行われるかもしれない間に状況の広い配列があります。
また、信号スロット機構は(ウェル非同期の場合と見なされるかもしれない)容易クロススレッド通信を行うことができ、私はその目的(エラーまたはなし)のためにそれらを使用します。
信号が処理されると仮定し、それはOKですか?
はシグナルは、(哲学)何かが起こったことを示すために設計されています。他の人が示されているとおり、それは信号がスロットを持つ、あるいは単にの1 他のスロットます。
と照合されると仮定することをお勧めことはありませんのCAN信号がアクションを開始するために使用されますか?例えば。信号displayInfoScreen()は、番組情報画面そのスロットによって処理されなければならない。
の信号は、あなたが考えている方法で、アクション、おそらくないを開始するために使用することができます。信号は、のFOO が起こっていることを示しています。あなたのクラスを監視コードはのFOO が発生したときに、ダイアログが表示されるべきであると決定した場合、その信号はそのアクションを開始するために使用しました。それはそのアクションを実行するための責任を負いませんので、しかし、それは、一般的に適切なアクションが発生することを確実にするために信号を発するクラスの責任ではありません。 (それがあった場合、それは同じクラスの一部、および必要とされる無信号であるべきである。)
信号/スロットは、オブジェクト間の結合を除去するための良い方法です。
たとえば、代わりにどのようにモデルの動作を理解する見解を持って、モデルが変更されたとき、彼らがモデルに「聞きます」。モデルは、それが変化したときに言うの責任があり、何が変化します。
イベントの問題点は、クライアントの要件を使用して、イベントを設計するときです。それは、この信号を使用してオブジェクトについて何かを想定しているので、たとえば、信号displayInfoScreen
を持つべきではありません。その代わりに、画面上にそれを表示するには、この信号にinfoChanged
とInfoScreenDisplayer
のリッスンする必要があります。あなたが必要な場合は、後で、彼らが変更するたびにツイーターの情報を掲示InfoTweeterPoster
を追加することができます。