Qml:差异是onPropertyChange并使用公式基于属性设置特定值)

时间:2018-02-27 21:54:33

标签: qt qml

假设我有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时所需的必要操作,第一种方法可能存在,也可能不存在。

两者之间的性能差异是什么?

1 个答案:

答案 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/

总结:

  • 您应该选择最易读的方法。在大多数情况下,这是绑定。
  • 您应该努力使属性之间的依赖关系变得简单。比绑定还可以优化
  • 使用JS时,使用绑定会不必要地使它复杂化。例如。当你事实上对一个不反映财产变化的事件或信号作出反应时。