Qt Quick 状态

AnchorChanges

指定如何在状态中更改项的锚点

ParentChange

指定如何在状态改变时重新为一个项建立父节点

PropertyChanges

描述状态的新属性绑定或值

State

定义对象和属性的配置

StateChangeScript

指定如何在状态中运行脚本

StateGroup

为非项目类型提供内置状态支持

许多用户界面设计都是状态驱动的;界面的配置因当前状态而异。例如,交通信号灯会根据其状态配置其标志或灯光。在信号灯的stop 状态下,红灯会亮起,黄灯和绿灯会熄灭。在caution 状态下,黄灯亮,其他灯熄灭。

在 QML 中,状态是在State 类型中定义的一组属性配置。例如,不同的配置可以

  • 显示某些用户界面组件,隐藏其他组件
  • 向用户展示不同的可用操作
  • 启动、停止或暂停动画
  • 在新状态下执行某些必要的脚本
  • 更改特定项目的属性值
  • 显示不同的视图或屏幕

所有基于Item 的对象都有一个state 属性,并可通过在项目的states 属性中添加新的State 对象来指定其他状态。组件中的每个状态都有一个唯一的name ,默认为空字符串。要更改项目的当前状态,可将state 属性设置为状态名称。

非项目对象可通过StateGroup 类型使用状态。

创建状态

要创建状态,可将State 对象添加到项目的states 属性中,该属性将保存项目的状态列表。

一个警告signal 组件可能有两个状态,即NORMALCRITICAL 状态。假设在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"
        }
    }
}

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

默认状态

每个基于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.stateCRITICALbell 组件就会变为RINGING 状态。

将状态变化动画化

状态变化会引起值的突然变化。Transition 类型可在状态变化时实现更平滑的变化。在转换过程中,可以定义动画和插值行为。动画和转场文章提供了有关创建状态动画的更多信息。

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

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

状态快进

为了使转换能正确地将状态变化制作成动画,引擎有时需要在最终应用状态前快进和倒退(即内部设置和取消设置状态)。具体过程如下

  1. 快进状态以确定完整的终值集。
  2. 状态被倒带。
  3. 完全应用状态,并进行转换。

在某些情况下,这可能会导致意想不到的行为。例如,改变视图模型或加载器源组件的状态会多次设置这些属性(应用、倒带、然后重新应用),这样做的代价可能相对较高。

状态快进应该被视为一个实现细节,在以后的版本中可能会有所改变。

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.