2013-07-03 22 views
0

我正在编写一些我没有写的代码,并且对实际操作感到困惑,实质上是使用信号和插槽来完成一切。何时适合使用Qt信号来通信DOWN依赖树?

我明白使用它们来传递UP依赖树(基本上,用作回调)。例如,如果我们有以下类:

MainWindow - >SomeDialog - >SomeView - >SomeModel

...和SomeModel能够改变一些共享的应用程序状态的,它可以发射信号changed()这是连接到一个插槽SomeView,后者又向SomeDialog等发送信号。

这是有价值的,因为它确保对象与其子之间不存在循环依赖关系; SomeModel不需要知道任何关于SomeView或其父母的信息。

但是你为什么要做反向?也就是说,如果我有AnotherDialog,AnotherView,​​,​​需要知道什么时候状态在SomeModel改变了,为什么我会用信号在下向方向通信呢?信号传播的路径最终被:

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

这是难以调试,混淆,和(据我可以说)完全没有必要。一旦信号传播到MainWindow,它可以直接调用其实例AnotherDialog上的方法,不需要信号......对吧?

我意识到这个问题可能过于模糊,但我想确保我不会在忽略所有旧代码之前忽略一些Qt设计原则。

+0

是否有一个原因,你会在每个类中发出一个新的信号,而不是直接将信号从SomeModel连接到AnotherModel? – thuga

+0

@thuga因为MainWindow不知道SomeModel或AnotherModel;它只是构建了对话框,这反过来又构建了视图等等。这本身就是一个设计缺陷,但我试图在这里一次解决一个问题...... –

+0

那么,有信号和插槽的原因之一,虽然它不完全涉及这种情况,但如果你有100个对象。因此,不要分别调用每个函数,只需发出一个连接到这些对象的某个插槽的信号即可。除了RA提到的那种线程关联外,我找不到任何使用信号和槽的原因,而不是直接调用一个函数。也许如果你不想使用全局变量,而是使用局部变量。 – thuga

回答

1

用于使用信号可能是因为AnotherDialogAnotherView和/或​​具有不同thread affinities(但即使如此,它可能已经优选使用QMetaObject::invokeMethod())的唯一原因。

如果所有这些类都存在于一个线程中,那么就没有任何理由使用信号。

这里似乎还有其他设计缺陷,但看着你的评论,好像你知道它们。

+0

我认为线程的亲和角度,但这些对象都在同一个线程,这是不太可能改变。所以我想我得到了我的答案,谢谢!在我花点时间让其他人称重(如果他们想要的话)之后,我会接受它。 –