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