使用Qt Quick行为与状态

使用行为动画属性变化

使用带有状态的行为

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

这里有一个展示问题的例子:

通过快速并反复地将鼠标移入和移出彩色矩形来测试示例,可以看到彩色矩形会逐渐变为绿色,而不会完全变回红色。这并不是我们想要的!问题出现的原因是我们使用了Behavior来动画化颜色的变化,而我们的状态变化是由鼠标进入或退出MouseArea触发的,这很容易被打断。

为了更正式地陈述问题,当同时使用状态和行为时,可能会导致意外行为:

  • Behavior 用于动画化属性更改,特别是在从显式定义的状态移回隐式基础状态时;

  • 此行为可以被中断以(重新)进入一个明确定义的状态。

问题的发生是因为QML的基础状态定义方式:作为应用程序在进入明确定义状态之前的“快照”状态。在这种情况下,如果我们正在从绿色动画返回到红色的过程中,并中断动画以返回到“GreenState”,基础状态将包括其动画中间形式的颜色。

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

  1. 使用过渡来动画化变化,而不是使用行为。

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

  3. 仅使用明确定义的状态,而不是隐式的基础状态