假设我有这个信号:
signals:
void progressNotification(int progress);
Run Code Online (Sandbox Code Playgroud)
我最近才了解到Qt中的emit关键字.到目前为止,我曾经通过像普通函数一样调用信号来执行信号.所以代替:
emit progressNotification(1000 * seconds);
Run Code Online (Sandbox Code Playgroud)
我会写:
progressNotification(1000 * seconds);
Run Code Online (Sandbox Code Playgroud)
像这样调用它们似乎工作,所有连接的插槽都会执行,使用emit关键字会导致不同的行为,还是只是语法糖?
Mat*_*Mat 82
emit只是语法糖.如果你看一下发出信号的函数的预处理输出,你会发现emit它已经消失了.
"魔术"发生在生成的信号发射函数代码中,您可以通过检查moc生成的C++代码来查看.
例如foo,没有参数的信号会生成此成员函数:
void W::foo()
{
QMetaObject::activate(this, &staticMetaObject, 0, 0);
}
Run Code Online (Sandbox Code Playgroud)
并且代码emit foo();被预处理为简单foo();
emit定义在Qt/qobjectdefs.h(无论如何在源代码的开源风格中),如下所示:
#ifndef QT_NO_EMIT
# define emit
#endif
Run Code Online (Sandbox Code Playgroud)
(定义保护是允许您通过no_keywordsQMake配置选项将Qt与其他具有冲突名称的框架一起使用.)