对于 属性 上的 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 兼容性。
假设我有一个 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 兼容性。