发射和发射之间的区别()

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)

有什么区别吗?

lpa*_*app 9

有什么区别吗?

除了外部支架是不必要的之外没有区别,因此程序员会更喜欢它,并且它也更常规地用于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也可以使用它.


asc*_*ler 5

没有区别.实际上,emit被定义为空宏,所以只是

someSignal(value);
Run Code Online (Sandbox Code Playgroud)

也是等价的.该emit只是使它你触发Qt的信号更加明显.