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 类型不仅限于对属性值进行修改。它还可以:

默认状态

每个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.stateCRITICAL时,bell组件将变为RINGING状态。

动画状态变化

状态变化会导致值的突然变化。Transition 类型允许在状态变化期间进行更平滑的变化。在过渡中,可以定义动画和插值行为。Animation and Transitions 文章提供了有关创建状态动画的更多信息。

Animation 示例演示了如何声明一组基本状态并在它们之间应用动画过渡。

使用Qt Quick Behaviors与状态解释了在使用Behaviors动画状态变化时的一个常见问题。

状态快速前进

为了使Transition能够正确动画化状态变化,引擎有时需要在最终应用状态之前快速前进和回退状态(即内部设置和取消设置状态)。过程如下:

  1. 状态被快速推进以确定完整的最终值集合。

  2. 状态被回滚。

  3. 状态完全应用,带有过渡。

在某些情况下,这可能会导致意外的行为。例如,改变视图的model或Loader的sourceComponent的状态会多次设置这些属性(应用、回滚,然后重新应用),这可能会相对昂贵。

状态快速转发应被视为实现细节,并可能在以后的版本中更改。