2011-12-23 8 views
0

私が所有している(へのポインタを所有し、初期化)Y1..10のQt:スタイルに関する信号/スロットは、

オブジェクトXが随時変化する状態を有するオブジェクトのオブジェクトXを有します。 私は子オブジェクト(Y1..10)に状態を認識させたいと思います。

通常、これは、各Y子オブジェクトから親Xへのポインタを持つことで解決できます。これにより、メソッド呼び出しによってステータスを照会できますが、YオブジェクトはオブジェクトX 、ちょうどその状態。

これが信号/スロットを実装することができる場合、私は思っていた:

Yオブジェクトは、次のような信号を定義する:Xオブジェクト

void GetStatus(TheStatus & status); 

をスロットにこれを接続し、いつであろうYオブジェクトによって放出されるオブジェクトXは、Yオブジェクトがそれを取得できるように、与えられたステータス参照にステータスを書き込みます。

このようにして、Yオブジェクトに対してステータス更新を利用できるようになりますが、それを達成するためにオブジェクトXを認識する必要はありません。

あなたはどう思いますか?

答えて

1

あなたはそれを後ろ向きに考えているようです。 Xオブジェクトが「通知」を行いたいオブジェクトであれば、それは信号を発信しているはずです。次に、Yオブジェクトはスロットを「受信者」にします。

だからXのオブジェクトは次のように、信号を放出すべきである:そしてYオブジェクトは一致スロットのいくつかの種類を持っているでしょう

void X::statusChanged(TheStatus status); 

。適切なプライベート/パブリック特権を仮定すると、任意のオブジェクト—(おそらくZまたはさらにはXとY)—はQObject::connectコールを使用して、一致するシグナルとオブジェクトインスタンスのスロットをまとめて結ぶことができます。信号を信号に結びつけることさえできます。

YのスロットをonStatusChangedのように呼び出せる可能性がありますが、これはデザインにカップリングが少し強すぎることを示唆しています。結局のところ、スロットは通常の方法のように呼び出すことができます。したがって、実際にスロットになっていると考えることができますが、その発信者に基づいて名前を付けるのではなく、それはより賢明かもしれません。

(別の関数を呼び出すfoo()機能ならば、我々は右、代わりにtheFunctionCalledByFoo()の、それが何に基づいていることに新しい名前bar()を与える傾向がある?)

マーティンがしようとする指摘したようにそれは望ましいですし、スロットがかなり基本的に使用するタイプを保持し、それらを値で送信します。ポインタと参照を送信すると、特に信号/スロットがキュー内で処理されるマルチスレッドのシナリオでは、オブジェクトの存続期間が心配になります。私は、ボタンのようなイベントに応答する受信機のためのdoBlah()を使用

http://developer.qt.nokia.com/doc/qt-4.8/qprogressbar.html#details

+0

ことと遊ぶの通知ベースクラスの良い例では、プログレスバーであるかもしれない理解するのは簡単です –

+0

@MartinBeckettプログレスバーは 'setValue()'を持っていますが、 'updateValue()'よりも良いか悪いのか分かりません。 "set"は、GUI要素を更新する関数の軽量化の可能性がありますが、どちらの方法でも見ることができます。いずれにしても、onValueChanged()よりも優れています。これは、スロットの場合と同様にシグナルの名前に似ています。 – HostileFork

+0

あなたがそれらを何と呼んでもそれは本当に問題ではありません。コンパイラはそれを強制することはないので、シグナル/スロットの機能を頭の中でまっすぐに保つためにいくつかの規約が必要です。 –

1

これはまさに信号/スロットのためのものです。

子どもは何人かの子供が信号に気づく必要がなくても信号を受信することができます。送信者はその信号のための受信機を必要としません。

一般に、信号/スロットによって送信される値は、複雑なオブジェクトではなく単純なものに保ちます。そうすることで、別々に変更する方が簡単です。

関連する問題