18 个月后......我开始在@Mat 的回答下发表评论,并且很快就没有空间了。从而得到答案。
IMOemit
既不是语法糖也不是简单的关键字,因为
- 它生成代码(如上面@Mat 所解释的),
- 它帮助
connect
机制认识到它确实是一个signal
, 和
- 它使您的信号成为“更大”系统的一部分,其中信号和响应(插槽)可以同步或异步执行,或排队执行,具体取决于信号发出的位置和方式。这是信号/槽系统的一个非常有用的功能。
整个信号/槽系统与简单的函数调用不同。我相信它源于观察者模式。signal
a和 a之间还有一个主要区别slot
:不必实现信号,而必须实现插槽!
你走在街上,看到一所房子着火了(信号)。您拨打 911(将火警信号与 911 响应插槽连接)。信号只是发出的,而槽是由消防部门实施的。可能不精确,但你明白了。让我们看一下OP的例子。
一些后端对象知道已经取得了多少进展。所以它可以简单地emit progressNotification(...)
发出信号。由显示实际进度条的类来获取此信号并在其上执行。但是视图是如何连接到这个信号的呢?欢迎使用 Qt 的信号/槽系统。现在可以设想一个管理器类(通常是某种小部件),它由一个视图对象和一个数据计算对象(两者都是QObjects
)组成,可以执行connect (m_myDataEngine, &DataEngine::progressNotification, m_myViewObj, &SimpleView::displayProgress)
。
让我们不要进入管理器类的设计方面,但只要说这就是信号/插槽系统的亮点就足够了。我可以专注于为我的应用程序设计一个非常干净的架构。并非总是如此,但很多时候,我发现我只是发出信号但实现了 slot。
如果可以在不发出信号的情况下使用/调用信号方法,那么它必然意味着您从一开始就不需要将该函数作为信号。