我正在使用一些我没有编写的代码,并且对基本上将信号和插槽用于绝对一切的做法感到困惑。
我理解使用它们来向上通信依赖树(基本上,用作回调)。例如,如果我们有以下类:
MainWindow-> SomeDialog-> SomeView->SomeModel
...并且SomeModel能够改变一些共享的应用程序状态,它可能会发出一个changed()连接到插槽的SomeView信号,然后再发送一个信号到SomeDialog,等等。
这很有价值,因为它确保了对象与其子对象之间没有循环依赖;SomeModel无需了解任何关于SomeView它或其父母的信息即可与之交流。
但是你为什么要反过来呢?也就是说,如果我有AnotherDialog,AnotherView和AnotherModel, 并且AnotherModel需要知道状态何时发生变化SomeModel,我为什么要使用信号向下进行通信?信号传播路径最终为:
SomeModel-> SomeView-> SomeDialog-> MainWindow-> AnotherDialog-> AnotherView->AnotherModel
这很难调试,令人困惑,并且(据我所知)完全没有必要。一旦信号传播到MainWindow,它可以AnotherDialog直接在其实例上调用一个方法,不需要信号......对吗?
我意识到这个问题可能过于模糊,但我想确保在重构所有旧代码之前不会忽略一些 Qt 设计原则。