oti*_*oza 6 c++ qt moc qt-signals qtcore
在Qt中,它们都是有效的,并且行为相同:
emit someSignal(value);
Run Code Online (Sandbox Code Playgroud)
VS
emit(someSignal(value));
Run Code Online (Sandbox Code Playgroud)
有什么区别吗?
有什么区别吗?
除了外部支架是不必要的之外没有区别,因此程序员会更喜欢它,并且它也更常规地用于Qt项目.
无差异的原因是由于:
# define emit
Run Code Online (Sandbox Code Playgroud)
您可以在源代码中看到此定义.
因此,它基本上只是声明为"空"字符串,预处理器将替换您的变体:
someSignal(value);
Run Code Online (Sandbox Code Playgroud)
要么
(someSignal(value));
Run Code Online (Sandbox Code Playgroud)
如果为了快速测试,在运行预处理器之后停止执行编译器,例如-Egcc中的选项,您可以自己看到这个.
更多信息:评论中有人对emit关键字有疑问,因为它污染了全局宏命名空间.这是事实,但这是一种确保有一些共同的方法来做这件事的好方法.
另一方面,这不是强制性的,所以任何人都可以通过告诉Qt不使用如下关键字来重新定义,取消定义甚至关闭它:
CONFIG += no_keywords
Run Code Online (Sandbox Code Playgroud)
这样一来,它仍然有可能使用Qt的信号槽机制Q_SIGNAL,Q_SIGNALS,Q_SLOT,Q_SLOTS,Q_EMIT和所有.
在这里,你可以找到相应的文件有关Q_EMIT,例如:
Q_EMIT
如果要将Qt信号和插槽与第三方信号/插槽机制一起使用,请使用此宏替换emit关键字以发出信号.
通常在.pro文件中使用CONFIG变量指定no_keywords时使用宏,但即使未指定no_keywords也可以使用它.
没有区别.实际上,emit被定义为空宏,所以只是
someSignal(value);
Run Code Online (Sandbox Code Playgroud)
也是等价的.该emit只是使它你触发Qt的信号更加明显.