Qt:关于信号/插槽的风格

时间:2011-12-23 16:01:35

标签: qt signals-slots observer-pattern

我有一个拥有的Object X(拥有指向并初始化的对象)对象Y1..10

对象X的状态会不时变化。 我希望子对象(Y1..10)能够了解状态。

通常,这可以通过从每个Y子对象获得指向父X的指针来解析,以便它可以通过方法调用查询其状态,但我不希望Y对象知道对象X,只是它的状态。

我想知道这是否可以通过信号/插槽来实现:

Y对象将定义一个信号,如:

void GetStatus(TheStatus & status);

X对象将它连接到一个插槽,当由Y对象发出时,对象X会将状态写入给定的状态参考,以便Y对象获取它。

这样我可以为Y对象提供状态更新,但是,他们不需要知道对象X来实现它。

您怎么看?

2 个答案:

答案 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