我有一个拥有的Object X(拥有指向并初始化的对象)对象Y1..10
对象X的状态会不时变化。 我希望子对象(Y1..10)能够了解状态。
通常,这可以通过从每个Y子对象获得指向父X的指针来解析,以便它可以通过方法调用查询其状态,但我不希望Y对象知道对象X,只是它的状态。
我想知道这是否可以通过信号/插槽来实现:
Y对象将定义一个信号,如:
void GetStatus(TheStatus & status);
X对象将它连接到一个插槽,当由Y对象发出时,对象X会将状态写入给定的状态参考,以便Y对象获取它。
这样我可以为Y对象提供状态更新,但是,他们不需要知道对象X来实现它。
您怎么看?
答案 0 :(得分:1)
这正是信号/插槽的用途。
任何数量的孩子都可以订阅信号,而发送代码不需要知道它们,发送者甚至不需要任何接收器来获取信号。
一般情况下,我尝试保持信号/插槽发送的值简单而不是复杂的对象 - 这样就可以更容易地单独进行更改。
答案 1 :(得分:1)
看起来你正在考虑倒退。如果X对象是想要进行“通知”的对象,那么它应该发出信号。然后Y对象将该槽作为“接收器”。
所以X对象应该发出一个信号,如:
void X::statusChanged(TheStatus status);
然后Y对象会有某种匹配的插槽。假设有适当的私有/公共特权,任何对象 - 可能是Z或甚至X和Y本身 - 都可以使用QObject::connect
调用将对象实例的匹配信号和插槽连接在一起。您甚至可以将信号与信号联系起来。
虽然你可以在Y中调用那个像onStatusChanged
这样的插槽,但这表明你的设计中的耦合太紧了。毕竟,可以像常规方法一样调用插槽。因此,如果你能想到插槽实际上做什么而不是根据其调用者命名它,那就更明智了。
(如果函数foo()
调用另一个函数,我们倾向于根据它的作用给出一个新名称bar()
,而不是theFunctionCalledByFoo()
,对吗?)< / em>的
最好像Martin指出的那样尝试保持插槽使用的类型相当基本并按值发送它们。如果发送指针和引用,则会担心对象的生命周期,尤其是在队列中处理信号/槽的多线程场景中。
使用简单易懂的基于通知的类的一个很好的例子可能是进度条:
http://developer.qt.nokia.com/doc/qt-4.8/qprogressbar.html#details