Emit和emit的区别()
-
21-12-2019 - |
题
在Qt中,它们都是有效的,并且行为相同:
emit someSignal(value);
vs的
emit(someSignal(value));
有什么区别吗?
解决方案
有什么区别吗?
除了外部支架是不必要的之外,没有任何区别,所以程序员会更喜欢它,而且它也更常用于Qt项目。
没有差异的原因是由于这一点:
# define emit
你可以看到这个的定义 在源代码中.
因此,它基本上只是声明为"空"字符串,预处理器将替换您的变体为:
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信号和具有第三方信号/插槽机制的插槽时,请使用此宏替换发射信号的emit关键字。
通常在.pro文件中使用CONFIG变量指定no_keywords时使用该宏,但即使未指定no_keywords也可以使用该宏。
其他提示
没有区别。事实上, emit
被定义为空宏,所以只
someSignal(value);
也是等价的。该 emit
只是让它更明显你正在触发Qt信号。
绝对没有区别。它是一个空预处理器定义,因此在编译器才能看到代码之前被删除。就编制者而言,它甚至没有存在。
它纯粹是为了程序员的好处,让他/她知道,在那一点上,可能会处理信号,并可能有助于调试代码。
不隶属于 StackOverflow