【问题标题】:Difference between emit and emit()发射和发射()之间的区别
【发布时间】:2014-05-27 00:38:18
【问题描述】:

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

emit someSignal(value);

emit(someSignal(value));

有什么不同吗?

【问题讨论】:

    标签: c++ qt qtcore qt-signals moc


    【解决方案1】:

    有什么不同吗?

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

    没有区别的原因是这样的:

    # define emit
    

    你可以看到这个in the source code的定义。

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

    someSignal(value);
    

    (someSignal(value));
    

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

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

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

    CONFIG += no_keywords
    

    这样,仍然可以将 Qt 信号槽机制与Q_SIGNALQ_SIGNALSQ_SLOTQ_SLOTSQ_EMIT 等一起使用。

    在这里你可以找到关于Q_EMITcorresponding documentation,例如:

    Q_EMIT

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

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

    【讨论】:

    • 好的,我现在发现moc 确实也忽略了emit(尽管文档很好地隐藏了这一事实)。我的新理论(不要失去对 QT 开发人员的全部信心)是信号槽机制的早期实现确实确​​实需要这个关键字,并且由于向后兼容性(并且可能他们没有记录这一事实,以防他们在以后的版本中再次需要它)。无论如何,他们所有的文档都使用不带括号的emit 这一事实表明,在您的代码中也省略它们是一个好主意(阅读,更多未来证明)。
    • @celtschk moc 不需要使用emit 关键字,因为moc 生成信号方法的实现。毕竟,信号只是一种迭代连接的插槽并激活(调用)它们的方法。 IIRC,在已发布的 Qt 版本中从未有一次 moc 使用了 emit 关键字。该关键字用于you 记录your 代码。它仅供人类食用,我很高兴它的存在。我不知道文档隐藏了什么,没有任何文档就很明显信号是如何工作的。这是基本的 C++。
    【解决方案2】:

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

    someSignal(value);
    

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-08
        • 2019-01-11
        • 1970-01-01
        • 1970-01-01
        • 2018-08-05
        • 2015-10-20
        • 2020-03-22
        相关资源
        最近更新 更多