0

我正在使用一些我没有编写的代码,并且对基本上将信号和插槽用于绝对一切的做法感到困惑。

我理解使用它们来向上通信依赖树(基本上,用作回调)。例如,如果我们有以下类:

MainWindow-> SomeDialog-> SomeView->SomeModel

...并且SomeModel能够改变一些共享的应用程序状态,它可能会发出一个changed()连接到插槽的SomeView信号,然后再发送一个信号到SomeDialog,等等。

这很有价值,因为它确保了对象与其子对象之间没有循环依赖;SomeModel无需了解任何关于SomeView它或其父母的信息即可与之交流。

但是你为什么要反过来呢?也就是说,如果我有AnotherDialog,AnotherViewAnotherModel, 并且AnotherModel需要知道状态何时发生变化SomeModel,我为什么要使用信号向下进行通信?信号传播路径最终为:

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

这很难调试,令人困惑,并且(据我所知)完全没有必要。一旦信号传播到MainWindow,它可以AnotherDialog直接在其实例上调用一个方法,不需要信号......对吗?

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

4

1 回答 1

1

The only reason for using signals might be because AnotherDialog, AnotherView and/or AnotherModel have different thread affinities (but even then it might have been preferable to use QMetaObject::invokeMethod()).

If all of these classes exist within a single thread, then there wouldn't be any good reason to use signals.

There do appear to be other design flaws here, but looking at your comments it seems as though you're aware of them.

于 2013-07-03T20:28:26.883 回答