如何在QML中执行多行Qt.binding()语句?

时间:2018-03-15 20:31:08

标签: qt qml qt5

我有一个简单的QML应用程序,其中有一个Board(它只是一个名为' parentRect'的矩形)和一个较小的子矩形(名为' childRect')。

我希望每当 parentRect 不透明度 0 变为 1.0 , childRect 的不透明度也会改变其最终值的相同数量,但我希望 childRect 使用OpacityAnimator执行不透明度变化的动画。

这里有一个问题:

我试图这样做,以便如果不透明度从 0 变为 1 ,则OpacityAnimator的持续时间会很长,并且如果不透明度从 1.0 变为 0 ,则持续时间将非常短。

到目前为止,这是我尝试的内容:

Rectangle {
    id: parentRect

    Rectangle {
        id: childRect
        opacity: parentRect.opacity
        visible: true
        property int index: 10
        Behavior on opacity {

            OpacityAnimator {
                duration: Qt.binding(function () {
                    if (parentRect.opacity === 0) {
                        return (50 * (index + 2))
                    } else {
                        return (2 * (index + 2))
                    }
                })
            }
        }
    }

执行代码后,我收到以下错误:

  

qrc:/main.qml:138:47:在绑定中无效使用Qt.binding()   声明。

有没有人知道为什么我的Qt.binding属性无效?

1 个答案:

答案 0 :(得分:2)

在进行命令式绑定时只使用Qt.binding(),即执行someProp = Qt.binding(someFoo)时,与常规赋值不同,它会将属性值绑定到表达式。

在您的情况下,您需要使用常规声明性绑定语法。如果它对于单行而言过于复杂,则可以将其写为函数,除了“标题”部分。

someProp: {
  if (cond) {
     return val1
  } else {
     return val2
  }
}

如果你愿意的话。因为在您的情况下,您可以简单地使用三元条件运算符:

duration: parentRect.opacity ? (50 * (index + 2)) : (2 * (index + 2))

甚至:

duration: (index + 2) * (parentRect.opacity ? 50 : 2)