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

如何在QML中执行多行Qt.binding()语句?,qt,qml,qt5,Qt,Qml,Qt5,我有一个简单的QML应用程序,其中有一块板(它只是一个名为“parentRect”的矩形)和一个较小的子矩形(名为“childRect”) 我想这样做,每当parentRect的不透明度从0变为1.0时,childRect的不透明度也会为其最终值更改相同的量,但我希望childRect使用一个不透明度动画来执行不透明度更改的动画 这里有一个陷阱: 我试图使它这样,如果不透明度从0到1,则不透明度图像的持续时间将很长,如果不透明度从1.0到0,持续时间将很短 到目前为止,我已经尝试了以下几点: R

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

我想这样做,每当parentRect的不透明度从0变为1.0时,childRect的不透明度也会为其最终值更改相同的量,但我希望childRect使用一个不透明度动画来执行不透明度更改的动画

这里有一个陷阱:

我试图使它这样,如果不透明度从01,则不透明度图像的持续时间将很长,如果不透明度从1.00,持续时间将很短

到目前为止,我已经尝试了以下几点:

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属性无效吗?在进行命令式绑定时,您只使用
Qt.binding()
,也就是说,当您执行
someProp=Qt.binding(someFoo)
,这与常规赋值不同,将属性值绑定到表达式

在您的情况下,需要使用常规的声明性绑定语法。如果它对于一行来说太复杂,可以将其作为一个函数写入,保存为“header”部分

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

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

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

我无法用您共享的代码重现错误。。它运行时没有错误?我在底部包含了错误消息。。我提供的代码是代码的最小部分。。你想要整件事吗?它会在错误消息弹出后继续运行如果这个最小的代码不足以重现问题,那么至少对我来说可能很难再进一步。请再次检查共享部分,它似乎缺少底部的右括号,所以是QML解析器破坏了东西。。。我懂了。。。三元条件运算符示例难道不只是简单地分配方程中产生的任何值,而不是动态地改变吗?不,不会,这是QML中进行绑定的标准方法,
Qt.binding()
函数只存在于角落情况。每个带有通知的属性都会导致表达式在更改时重新计算,而且,如果在绑定表达式中使用未带有通知的属性,则会收到警告。回答非常好@dtech“如果在没有通知的情况下使用属性,则会收到警告”,除非标记为常量
duration: (index + 2) * (parentRect.opacity ? 50 : 2)