Qt Quick:创建过渡时的代码冗余

Qt Quick: Code redundancy when creating Transition

我的代码:

states: [
    State {
        name: "pressed"; when: mouseArea.pressed
        PropertyChanges {
            target: foo
            prop1: 10
            prop2: 10
            prop3: 10
        }
    },
    State {
        name: "notPressed"; when: !mouseArea.pressed
        PropertyChanges {
            target: foo
            prop1: 1
            prop2: 1
            prop3: 1
        }
    }
]
transitions: [
    Transition {
        to: "*"
        NumberAnimation {
            target: foo
            properties: "prop1,prop2,prop3"
            duration: 1000
        }
    }
]

这可行,但需要我在 PropertyChanges 元素中指定要更改的属性时冗余地指定 properties: "prop1,prop2,prop3"。此外,当 PropertyChanges 元素中已指定 target: foo 时,我需要在 NumberAnimation 中冗余指定 target: foo

可以避免这种冗余吗?如果不是,为什么不呢?

属性 变化并不一定意味着它会被动画化。并且所有 属性 更改也没有必要具有相同的动画。

我在这里没有看到冗余,如果您想要的行为是默认的,您将无法对发生的事情进行细粒度控制。对于所有 属性 更改,您将遇到相同的行为,这可能适合您的特定需求,但实际上在所有其他情况下都会有很大问题。

正如@ddriver 所说,这是对状态更改期间的动画进行精细控制所必需的。

但是在这里,如果您的所有属性都更改为与您的示例中相同的值,您可以重构它并将它们绑定到一个公共 属性。 像这样:

property int bar: mouseArea.pressed ? 10 : 1
prop1: bar
prop2: bar
prop3: bar

states: [
    State {
        name: "pressed"; when: mouseArea.pressed
        PropertyChanges {
            target: foo
            bar: 10
        }
    },
    State {
        name: "notPressed"; when: !mouseArea.pressed
        PropertyChanges {
            target: foo
            bar: 1
        }
    }
]
transitions: [
    Transition {
        to: "*"
        NumberAnimation {
            target: foo
            property: "bar"
            duration: 1000
        }
    }
]

或者,如果您的过渡是对称的(使用从状态 A -> 状态 B 和从状态 B -> A 的相同动画),您可以使用 Behavior 来简化您的代码:

property int bar: mouseArea.pressed ? 10 : 1
prop1: bar
prop2: bar
prop3: bar

Behavior on bar {
    NumberAnimation { duration: 1000 }
}