8

在 Qt 中,它们都是有效的,并且行为相同:

emit someSignal(value);

对比

emit(someSignal(value));

有什么区别吗?

4

3 回答 3

11

有什么区别吗?

除了不需要外部括号之外没有其他区别,因此程序员会更喜欢它,并且它也更常规地用于 Qt 项目中。

没有区别的原因是:

# define emit

您可以在源代码中看到 this 的定义。

因此,它基本上只是声明为“空”字符串,预处理器会将您的变体替换为:

someSignal(value);

或者

(someSignal(value));

如果为了快速测试,在运行预处理器后停止编译器的执行,您可以自己看到这一点,例如-Egcc 的选项。

更多信息:评论中有人对 emit 关键字表示怀疑,因为它污染了全局宏命名空间。这是真的,但这是确保有一些通用的方法来做到这一点的好方法,这是一件好事。

另一方面,这不是强制性的,因此任何人都可以通过告诉 Qt不要使用关键字来重新定义、取消定义甚至关闭它,如下所示:

CONFIG += no_keywords

这样,仍然可以将 Qt 信号槽机制与Q_SIGNAL, Q_SIGNALS, Q_SLOT,Q_SLOTS等一起Q_EMIT使用。

在这里您可以找到关于 的相应文档Q_EMIT,例如:

Q_EMIT

当您想将 Qt 信号和插槽与 3rd 方信号/插槽机制一起使用时,使用此宏替换用于发出信号的 emit 关键字。

该宏通常在 .pro 文件中使用 CONFIG 变量指定 no_keywords 时使用,但即使未指定 no_keywords 也可以使用该宏。

于 2014-04-13T00:44:18.247 回答
6

没有区别。实际上,emit被定义为一个空宏,所以就

someSignal(value);

也是等价的。emit只是让你更明显地触发了一个 Qt 信号。

于 2014-04-12T22:00:32.360 回答
1

绝对没有区别。这是一个空的预处理器定义,因此在编译器看到代码之前就被删除了。就编译器而言,它甚至不存在。

它的存在纯粹是为了程序员的利益,让他/她知道此时可能会处理信号并可能有助于调试代码。

于 2014-04-13T08:20:52.240 回答