Qt5发出语法接受插槽名称。是通过事件队列处理插槽

时间:2014-09-12 00:11:12

标签: qt signals slot eventqueue

我偶然发现,不是以前连接到插槽的正常发射信号的方式,另一种触发插槽的方式是:

emit(slotname());

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

1 个答案:

答案 0 :(得分:3)

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

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

emit nameChanged()

相当于

nameChanged()

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

因此,emit(slotname())会破坏目的并使代码读者感到困惑。

如果您感到好奇,emit中定义了QtCore\qobjectdefs.h

# define emit