在 Qt 中,它们都是有效的,并且行为相同:
emit someSignal(value);
对比
emit(someSignal(value));
有什么区别吗?
在 Qt 中,它们都是有效的,并且行为相同:
emit someSignal(value);
对比
emit(someSignal(value));
有什么区别吗?
有什么区别吗?
除了不需要外部括号之外没有其他区别,因此程序员会更喜欢它,并且它也更常规地用于 Qt 项目中。
没有区别的原因是:
# define emit
您可以在源代码中看到 this 的定义。
因此,它基本上只是声明为“空”字符串,预处理器会将您的变体替换为:
someSignal(value);
或者
(someSignal(value));
如果为了快速测试,在运行预处理器后停止编译器的执行,您可以自己看到这一点,例如-E
gcc 的选项。
更多信息:评论中有人对 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 也可以使用该宏。
没有区别。实际上,emit
被定义为一个空宏,所以就
someSignal(value);
也是等价的。emit
只是让你更明显地触发了一个 Qt 信号。
绝对没有区别。这是一个空的预处理器定义,因此在编译器看到代码之前就被删除了。就编译器而言,它甚至不存在。
它的存在纯粹是为了程序员的利益,让他/她知道此时可能会处理信号并可能有助于调试代码。