我偶然发现,不是以前连接到插槽的正常发射信号的方式,另一种触发插槽的方式是:
emit(slotname());
我喜欢我可以跳过创建信号和连接的步骤,但是这真的会导致通过事件队列处理插槽吗?或者这只是直接调用插槽方法?
答案 0 :(得分:3)
没有。 emit(slotname())
等于(slotname())
,它只是在没有队列的情况下直接调用slotname()
。并且它不会自动调用连接到信号的其他插槽。
emit
实际上是一个评估为空的宏。它只是一个语法糖,表明代码正在发出信号。因此以下一行
emit nameChanged()
相当于
nameChanged()
没什么特别的,你实际上是在调用nameChanged()
信号方法。不同之处在于您没有自己实施信号方法。你离开Qt的moc来生成实现。生成的实现将直接或通过队列调用所有连接的插槽,具体取决于连接的方式和执行线程。
因此,emit(slotname())
会破坏目的并使代码读者感到困惑。
如果您感到好奇,emit
中定义了QtCore\qobjectdefs.h
:
# define emit