0

我很偶然地发现,与以前连接到插槽的正常发出信号的方式不同,触发插槽的另一种方法是:

emit(slotname());

我喜欢我可以跳过创建信号和连接的步骤,但这真的会导致插槽通过事件队列处理吗?或者这只是直接调用 slot 方法?

4

1 回答 1

3

No.emit(slotname())等于,它只是直接(slotname())调用而没有队列。并且它不会自动调用连接到信号的其他插槽。slotname()

emit实际上是一个计算结果为空的宏。这只是一个语法糖,表明代码正在发出信号。因此以下行

emit nameChanged()

相当于

nameChanged()

没什么特别的,你实际上是在调用nameChanged()信号方法。不同之处在于您不自己实现信号方法。您离开 Qt 的 moc 来生成实现。生成的实现将直接或通过队列调用所有连接的插槽,具体取决于连接的建立方式和执行线程。

因此,emit(slotname())违背了目的并使代码阅读者感到困惑。

如果你很好奇,emit定义在QtCore\qobjectdefs.h

# define emit
于 2014-09-12T02:01:45.290 回答