Qt Quick 状态¶
创建和设置状态
创建状态¶
要创建一个状态,请将State对象添加到项目的states属性中,该属性保存该项目的状态列表。
一个警告signal组件可能有两种状态,NORMAL状态和CRITICAL状态。假设在NORMAL状态下,信号的color应为green,并且警告flag处于下降状态。同时,在CRITICAL状态下,color应为red,并且标志处于up状态。我们可以使用State类型来建模状态,并使用PropertyChanges类型来建模颜色和标志的配置。
Rectangle { id: signal width: 200; height: 200 state: "NORMAL" states: [ State { name: "NORMAL" PropertyChanges { target: signal; color: "green"} PropertyChanges { target: flag; state: "FLAG_DOWN"} }, State { name: "CRITICAL" PropertyChanges { target: signal; color: "red"} PropertyChanges { target: flag; state: "FLAG_UP"} } ] }
PropertyChanges 类型将更改对象属性的值。对象通过其 id 引用。组件外部的对象也使用 id 属性引用,例如对外部 flag 对象的属性更改。
此外,可以通过为state属性分配适当的信号状态来改变状态。状态切换可以在MouseArea类型中进行,每当信号接收到鼠标点击时分配不同的状态。
Rectangle { id: signalswitch width: 75; height: 75 color: "blue" MouseArea { anchors.fill: parent onClicked: { if (signal.state == "NORMAL") signal.state = "CRITICAL" else signal.state = "NORMAL" } } }
State 类型不仅限于对属性值进行修改。它还可以:
使用StateChangeScript运行一些脚本
使用PropertyChanges覆盖对象的现有信号处理程序
使用ParentChange重新设置Item的父级
使用AnchorChanges修改锚点值
默认状态¶
每个Item基于的组件都有一个state属性和一个默认状态。默认状态是空字符串(""),并包含项目的所有初始属性值。默认状态在状态更改之前管理属性值非常有用。将state属性设置为空字符串将加载默认状态。
当 `` when``
属性¶
为了方便起见,State 类型有一个 when 属性,可以绑定到表达式,以便在绑定的表达式评估为 true 时更改状态。当表达式评估为 false 时,when 属性会将状态恢复为 default state。
Rectangle { id: bell width: 75; height: 75 color: "yellow" states: State { name: "RINGING" when: (signal.state == "CRITICAL") PropertyChanges {target: speaker; play: "RING!"} } }
每当signal.state为CRITICAL时,bell组件将变为RINGING状态。
动画状态变化¶
状态变化会导致值的突然变化。Transition 类型允许在状态变化期间进行更平滑的变化。在过渡中,可以定义动画和插值行为。Animation and Transitions 文章提供了有关创建状态动画的更多信息。
Animation 示例演示了如何声明一组基本状态并在它们之间应用动画过渡。
使用Qt Quick Behaviors与状态解释了在使用Behaviors动画状态变化时的一个常见问题。
状态快速前进¶
为了使Transition能够正确动画化状态变化,引擎有时需要在最终应用状态之前快速前进和回退状态(即内部设置和取消设置状态)。过程如下:
状态被快速推进以确定完整的最终值集合。
状态被回滚。
状态完全应用,带有过渡。
在某些情况下,这可能会导致意外的行为。例如,改变视图的model或Loader的sourceComponent的状态会多次设置这些属性(应用、回滚,然后重新应用),这可能会相对昂贵。
状态快速转发应被视为实现细节,并可能在以后的版本中更改。