Qt Quick 状态

锚点更改

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

父项更改

指定如何在状态更改中重新父项项

属性更改

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

状态

定义对象和属性的配置

状态更改脚本

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

状态组

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

许多用户界面设计是 状态驱动 的;接口根据当前状态有不同的配置。例如,交通信号灯将根据其状态配置其旗帜或灯光。当信号处于 停止 状态时,红灯会亮起,而黄灯和绿灯会熄灭。在 警告 状态下,黄灯亮起,而其他灯光熄灭。

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

  • 显示一些 UI 组件并隐藏其他组件
  • 向用户展示不同的可用操作
  • 开始、停止或暂停动画
  • 执行新状态所需的某些脚本
  • 更改特定项的属性值
  • 显示不同的视图或屏幕

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

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

创建状态

要创建状态,将 State 对象添加到项的 states 属性中,该属性包含该项的状态列表。

一个可能有两个状态的警告 signal 组件,分别是 NORMALCRITICAL 状态。假设在 NORMAL 状态下,信号的颜色应该是 绿色,警告旗帜是降下的。同时,在 CRITICAL 状态下,颜色应该是 红色,而旗帜是升起的。我们可以使用 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 时更改状态。当表达式评估为假时,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 解释了使用 Behaviors 动画状态更改时遇到的一个常见问题。

状态快进

为了让转换正确地动画化状态更改,有时需要引擎在最终应用之前预览和回退状态(即在内部设置和取消状态)。该过程如下

  1. 将状态预览以确定最终值的集合。
  2. 回退状态。
  3. 使用过渡完全应用状态。

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

应将状态快进视为实现细节,并且可能会在以后的版本中更改。

© 2024 The Qt Company Ltd. 本文档中包含的文档贡献均为各自所有者的版权。提供的文档是根据自由软件基金会发布的GNU自由文档许可版本1.3许可的。Qt及其相关标志是芬兰及全球其他国家的The Qt Company Ltd.的商标。所有其他商标均为各自所有者的财产。