Qt Quick 状态#

创建和设置状态

创建状态#

要创建状态,请将该 State 对象添加到项的 states 属性,该项属性保留了一个状态列表。

警告信号组件可能有两种状态,即正态状态和关键状态。假设在正态状态下,信号的color应该是绿色,警告标志处于关闭状态。而在关键状态下,信号的颜色应该是红色,标志处于开启状态。我们可以使用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"
        }
    }
}

状态类型不仅仅限于对属性值进行修改,还可以

默认状态#

每个基于Item的组件都有一个state属性和一个默认状态。默认状态是一个空字符串(""),包含项的所有初始属性值。默认状态在管理状态更改之前的状态有助于管理属性值。将state属性设置为空字符串将加载默认状态。

``when``

属性#

为了方便起见,State类型有一个可以绑定到表达式的when属性,以便在绑定的表达式评估为true时更改状态。当表达式评估为false时,when属性将恢复到默认状态

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允许在状态变化时实现更平滑的转变。在转变中,可以定义动画和插值行为。《动画和转变》文章提供了更多有关创建状态动画的信息。

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

使用状态与Qt Quick行为解释了使用行为动画状态变化时遇到的一个常见问题。

状态快进#

为了使Transition正确地动画化状态变化,有时需要引擎在应用状态之前快进和回放一个状态(即在内部设置和取消设置状态)。这个过程如下所示

  1. 状态被快进以确定完整的结束值集。

  2. 状态被回放。

  3. 状态被完全应用,包括转变。

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

应该将状态快进视为实现细节,并且在后续版本中可能会变化。