0

私は書いていないいくつかのコードを扱っており、本質的に、シグナルとスロットを絶対にすべてに使用するという慣行について混乱しています。

それらを使用して依存関係ツリーを通信することを理解しています(基本的に、コールバックとして使用されます)。たとえば、次のクラスがあるとします。

MainWindow-> SomeDialog-> SomeView->SomeModel

...そしてSomeModel、いくつかの共有アプリケーションの状態を変更することができます。それはchanged()、のスロットに接続されSomeViewた信号を発信し、次に、に信号を送信しますSomeDialog

これは、オブジェクトとその子の間に循環依存がないことを保証するため、価値があります。と通信するために、またはその親SomeModelについて何も知る必要はありません。SomeView

しかし、なぜ逆のことをするのでしょうか? つまりAnotherDialog、とがAnotherViewあり、で状態がいつ変更されたかを知る必要がある場合、なぜ信号を使用して方向に通信するのでしょうか? 信号伝搬の経路は次のようになります。AnotherModelAnotherModelSomeModel

SomeModel-> SomeView-> SomeDialog-> MainWindow-> AnotherDialog-> AnotherView->AnotherModel

これはデバッグが難しく、紛らわしく、(私が知る限り) まったく不要です。シグナルが に伝播されるとMainWindow、 のインスタンスで直接メソッドを呼び出すことができますAnotherDialog。シグナルは必要ありません...そうですか?

この質問は漠然としすぎているかもしれませんが、古いコードをすべてリファクタリングする前に、Qt の設計原則を無視していないことを確認したかったのです。

4

1 に答える 1

1

シグナルを使用する唯一の理由は、および/または異なるスレッド アフィニティを持っているためです(ただし、それでも を使用する方が望ましい場合があります)。AnotherDialogAnotherViewAnotherModelQMetaObject::invokeMethod()

これらのクラスがすべて 1 つのスレッド内に存在する場合、シグナルを使用する正当な理由はありません。

ここには他の設計上の欠陥があるように見えますが、コメントを見ると、それらを認識しているように見えます.

于 2013-07-03T20:28:26.883 に答える