【发布时间】:2014-05-27 00:38:18
【问题描述】:
在 Qt 中,它们都是有效的,并且行为相同:
emit someSignal(value);
对
emit(someSignal(value));
有什么不同吗?
【问题讨论】:
标签: c++ qt qtcore qt-signals moc
在 Qt 中,它们都是有效的,并且行为相同:
emit someSignal(value);
对
emit(someSignal(value));
有什么不同吗?
【问题讨论】:
标签: c++ qt qtcore qt-signals moc
有什么不同吗?
除了不需要外部括号之外没有其他区别,因此程序员会更喜欢它,并且它也更常规地用于 Qt 项目中。
没有区别的原因是这样的:
# define emit
你可以看到这个in the source code的定义。
因此,它基本上只是声明为“空”字符串,预处理器会将您的变体替换为:
someSignal(value);
或
(someSignal(value));
如果为了快速测试,在预处理器运行后停止编译器的执行,您可以自己看到这一点,例如在 gcc 的情况下 -E 选项。
更多信息:评论中有人对 emit 关键字表示怀疑,因为它污染了全局宏命名空间。确实如此,但这是确保有一些通用方法可以做到这一点的好方法,这是一件好事。
另一方面,这不是强制性的,因此任何人都可以重新定义、取消定义甚至关闭它by telling Qt 不使用关键字,如下所示:
CONFIG += no_keywords
这样,仍然可以将 Qt 信号槽机制与Q_SIGNAL、Q_SIGNALS、Q_SLOT、Q_SLOTS、Q_EMIT 等一起使用。
在这里你可以找到关于Q_EMIT的corresponding documentation,例如:
Q_EMIT
当您想将 Qt 信号和插槽与 3rd 方信号/插槽机制一起使用时,使用此宏替换用于发出信号的 emit 关键字。
该宏通常在 .pro 文件中通过 CONFIG 变量指定 no_keywords 时使用,但即使未指定 no_keywords 也可以使用该宏。
【讨论】:
moc 确实也忽略了emit(尽管文档很好地隐藏了这一事实)。我的新理论(不要失去对 QT 开发人员的全部信心)是信号槽机制的早期实现确实确实需要这个关键字,并且由于向后兼容性(并且可能他们没有记录这一事实,以防他们在以后的版本中再次需要它)。无论如何,他们所有的文档都使用不带括号的emit 这一事实表明,在您的代码中也省略它们是一个好主意(阅读,更多未来证明)。
moc 不需要使用emit 关键字,因为moc 生成信号方法的实现。毕竟,信号只是一种迭代连接的插槽并激活(调用)它们的方法。 IIRC,在已发布的 Qt 版本中从未有一次 moc 使用了 emit 关键字。该关键字用于you 记录your 代码。它仅供人类食用,我很高兴它的存在。我不知道文档隐藏了什么,没有任何文档就很明显信号是如何工作的。这是基本的 C++。
没有区别。其实emit被定义为一个空宏,所以就
someSignal(value);
也是等价的。 emit 只是让您更明显地触发了 Qt 信号。
【讨论】:
绝对没有区别。这是一个空的预处理器定义,因此在编译器看到代码之前就被删除了。就编译器而言,它甚至不存在。
它的存在纯粹是为了程序员的利益,让他/她知道此时可能会处理一个信号并可能有助于调试代码。
【讨论】: