对于 属性 上的 NOTIFY 信号,如果我给它一个参数会有什么不同?

For a NOTIFY signal on a property, what difference does it make if I give it a parameter?

假设我有一个 class 看起来像这样:

class Something : QObject {
  Q_PROPERTY(int something READ getSomething NOTIFY somethingChanged)

  // ...

  signals:
    void somethingChanged();
}

根据文档,将 somethingChanged 声明为 void somethingChanged()void somethingChanged(int)(注意参数)均有效。 为什么我要用一种方式而不是另一种方式?

发出该值允许您使用该值而无需引用它是 属性 的对象。这就是 C++ API 中通常的处理方式,这使您不必手动保留对对象的引用,这样您就可以在更改通知时读入值。请注意,即便如此,如有必要,您也可以使用 QObject::sender() 来查找发件人对象,但发出值更加直接。

在 QML 中,您大部分时间最终使用的是绑定,它非常快速且功能强大,并且涉及对对象的引用,并且更改通知会导致引用属性的绑定表达式自动重新评估。因此没有必要发出实际值。

没有什么能阻止您两全其美。发出新值的通知信号似乎与 QML 绑定一起工作得很好。因此,如果由于某种原因您需要 发出一个值,请不要回避它,它不会危及 QML 兼容性。