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 }
}
我的代码:
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 }
}