我正在学习 Qt,并且在信号插槽模式方面获得了很多乐趣。我的问题是,信号和槽只是事件监听器和处理程序的语法糖,还是后台发生的事情具有不同的性质?如果是后者,根本区别是什么?
最佳答案
不,它们存在的平均原因是 将发射和处理的 解耦。
这个想法是你将发射与某个“事件”的处理分开。如果您将直接函数调用视为替代方案,我想指出的是,与它们一起,负责发射的代码需要了解实际处理“信号”的代码。那就是这两个部分太紧太彼此了。
如果不更改负责信号发射的代码,就不可能为信号动态添加另一个处理程序。想象一个这样的例子:
如果有人想添加一种计算水果数量的方法怎么办?
使用信号槽机制,您无需接触原始代码。您可以简单地将新插槽连接到来自完全不同的代码段的现有信号。这叫做好的设计和自由。
当您拥有像 Qt 这样的库可以在不事先了解 Qt 应用程序的情况下四处发射信号时,这尤其有用。如何处理信号取决于 Qt 应用程序自己。
此外,这种模式还使应用程序响应更快,阻塞更少,方向函数调用就是这种情况。这是因为 Qt 信号槽机制所基于的事件循环的存在。当然,您也可以将线程与直接调用结合使用,但与理想世界中的需要相比,它会变得更加繁重且难以维护。
因此,正如部分已经触及的那样,后台有一个 QtEventLoop 排队这些事件以进行处理,尽管也可以执行“直接调用”。
真正的后台内部实现代码可以在那里和 moc(元对象编译器)中找到。 Moc 基本上是为您没有定义主体的信号创建一个函数,因此您只需在需要时在 QObject 子类中声明它们。
您可以在此处阅读有关该主题的更多信息,但我认为我的解释可以帮助您前进:
Qt Signals & Slots
QtDD13 - Olivier Goffart - Signals and Slots in Qt 5
How Qt Signals and Slots Work
How Qt Signals and Slots Work - Part 2 - Qt5 New Syntax
Signals and Slots in Qt5
Using the Meta-Object Compiler (moc)
关于c++ - 信号和插槽是语法糖还是更多?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23185946/