假设我有QML项目A
,如此:
Item A{
property real value
property real position: value*100
}
如您所见,我有两个属性,其中一个取决于另一个属性。使用onPropertyChanged
可以获得相同的结果。例如:
Item A{
property real value
property real position
onValueChanged:{
position=value*100
}
}
显然,第一种方法减少了额外的代码行。但是,有些情况下公式的右侧可能会变得复杂。根据触发onValueChanged
时所需的必要操作,第一种方法可能存在,也可能不存在。
两者之间的性能差异是什么?
答案 0 :(得分:1)
这两种方式可能适用于不同的情况。
第一种方式是“QML方式”。 QML意味着是一种声明性语言,这意味着您基本上只是声明属性和对象之间的关系。为此,他们引入了属性绑定。
主要原因是,要使文件易于阅读和理解。
在某些情况下,你只会遇到绑定 - 假设你有一个属性
property int lastPressedButtonId
这很难绑定某些东西。你可能会成功地使用任意疯狂的结构。但是,当您使用信号处理程序和JavaScript设置该属性时,您可以提高可读性。
该文档声明可以在翻译时优化简单绑定。因此,这将强烈支持使用绑定。
另一件事是 @folibis 的可能性 - 你可以将它绑定到一个函数。在这里,我不能告诉你很多关于性能差异的信息。我想这很少,因为只有当它无法转换为QV4 / Compiled Binding时才可能使用此方法。毕竟,无论如何,所有绑定都隐式转换为JS表达式。
您还可以绑定到C ++ Q_INVOKABLE / slot。我想在这里你需要传递所有属性,其更改将触发更新作为插槽的参数。我没有在很长一段时间内尝试过,因为我通常更愿意将C ++中的Q_PROPERTY与复杂计算的值一起发布到QML。
在这里,您将找到一个有趣的博客系列,处理属性绑定的内部及其优化:
https://www.kdab.com/qml-engine-internals-part-2-bindings/
http://www.kdab.com/qml-engine-internals-part-3-binding-types/
总结: