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

问题描述 投票:0回答:1

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

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

qt qml
1个回答
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会使其不必要地复杂化。例如。当你事实上对一个不反映财产变化的事件或信号做出反应时。
© www.soinside.com 2019 - 2024. All rights reserved.