我正在学习Qt,而且我对signal-slotpattern有很多乐趣.我的问题是,信号和槽只是事件监听器和处理程序的语法糖或后台发生的事情是不同的性质?如果以后,有什么根本区别?
解决方法:
Are signals and slots syntactic sugar or there is more to them? The question that I have is that, are signals and slots simply syntactic sugar for event listeners/handlers
不,它们存在的平均原因是排放和处理的分离.
or what happens in the background is of different nature?
我们的想法是将排放与某个“事件”的处理分开.如果你考虑直接函数调用作为替代,我想指出,对于它们,响应发射的代码需要知道实际处理“信号”的代码.那是两个部分彼此太紧了.
如果不改变负责信号发射的代码,就不可能为信号动态添加另一个处理程序.想象一个像这样的例子:
>代码的某些部分发出“水果到达”的信号
>此代码将直接调用“wash fruit”方法.
如果有人想添加一种计算水果数量的方法怎么办?
>需要修改以前的代码以包含对该方法的直接调用.
使用信号槽机制,您无需触摸原始代码.您可以简单地将新插槽连接到来自完全不同代码的现有信号.这被称为良好的设计和*.
当你有像Qt这样的库可以在不事先知道Qt应用程序的情况下发出信号时,这一点尤其有用.由Qt应用程序决定如何自己处理信号.
此外,这种模式还使应用程序响应更快,阻塞更少,这就是方向函数调用的情况.这是因为存在Qt信号槽机制的事件循环.当然,您也可以使用线程直接调用,但它比理想世界中的必要工作更难以维护.
因此,部分已经触及,后台有一个QtEventLoop排队这些事件进行处理,尽管也可以执行“直接调用”.
真正的后台内部实现代码可以在那里找到,并在moc(元对象编译器)中找到. Moc基本上是为您没有为其定义主体的信号创建函数,因此您只需在需要时在QObject子类中声明它们.
你可以在这里阅读更多关于这个主题的内容,但我认为我的解释可以帮助你:
QtDD13 – Olivier Goffart – Signals and Slots in Qt 5
How Qt Signals and Slots Work – Part 2 – Qt5 New Syntax
Using the Meta-Object Compiler (moc)