使用状态与Qt Quick行为#

使用行为使属性变化动画化

使用状态与行为#

在某些情况下,您可能希望使用行为来动画化由状态变更引起的属性更改。虽然这在某些情况下效果良好,但在其他情况下可能会导致意外的行为。

以下是一个显示问题的示例

通过快速并重复地将鼠标移动到彩色矩形内部和外部来测试示例,我们可以看到彩色矩形将随着时间的推移逐渐变为绿色,永远不会回到完全的红色。这不是我们想要的!问题是由于我们使用了行为来动画化颜色的变化,并且我们的状态变更是由鼠标进入或离开MouseArea触发的,这很容易被中断。

更正式地陈述问题,使用状态和行为一起可能导致预期之外的行为,当:

  • 使用行为来动画化属性变化,特别是从显式定义的状态返回到隐式基状态时;

  • 这个行为可以被中断,以(重新)进入显式定义的状态。

问题是由于QML中基状态的定义方式:它是进入显式定义状态之前应用的“快照”状态。在这种情况下,如果我们正在从绿色动画回到红色,并且在返回“GreenState”时中断动画,基状态将包括动画过程中的中间形式和颜色。

虽然QML的将来版本应该能够更加优雅地处理这种情况,但目前有几种方法可以重新设计您的应用程序以避免这个问题。

  1. 使用转换而不是行为来动画化变化。

  2. 使用条件绑定来更改属性值而不是使用状态。

  3. 仅使用显式定义的状态而不是隐式基状态。