Qt Quick 状态
相关类型
指定如何在状态中更改项的锚点 | |
指定如何在状态更改中重新父项项 | |
描述状态的新属性绑定或值 | |
定义对象和属性的配置 | |
指定如何在状态中运行脚本 | |
为非项类型提供内置状态支持 |
许多用户界面设计是 状态驱动 的;接口根据当前状态有不同的配置。例如,交通信号灯将根据其状态配置其旗帜或灯光。当信号处于 停止
状态时,红灯会亮起,而黄灯和绿灯会熄灭。在 警告
状态下,黄灯亮起,而其他灯光熄灭。
在 QML 中,状态 是在 状态 类型中定义的一组属性配置。不同的配置可以是,例如
- 显示一些 UI 组件并隐藏其他组件
- 向用户展示不同的可用操作
- 开始、停止或暂停动画
- 执行新状态所需的某些脚本
- 更改特定项的属性值
- 显示不同的视图或屏幕
所有基于 Item 的对象都有一个 state
属性,可以通过向项的 states 属性添加新的 State
对象来指定额外的状态。组件中的每个状态都有一个唯一的 name
,空字符串是默认值。要更改项的当前状态,将 state 属性设置为状态的名称。
非项对象可以通过 StateGroup 类型使用状态。
创建状态
要创建状态,将 State 对象添加到项的 states 属性中,该属性包含该项的状态列表。
一个可能有两个状态的警告 signal
组件,分别是 NORMAL
和 CRITICAL
状态。假设在 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" } } }
状态类型不仅限于对属性值进行修改。它还可以
- 使用 StateChangeScript 运行某些脚本
- 使用 PropertyChanges 覆盖对象现有的信号处理器
- 使用 ParentChange 重新设置 Item 的父级
- 使用 AnchorChanges 修改锚点值
默认状态
每个基于 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.state
是 CRITICAL
时,bell
组件将更改为 RINGING
状态。
动画状态更改
状态更改会导致值的突变。类型 Transition 允许状态更改期间更平滑的变化。在转换中,可以定义动画和插值行为。《更多关于创建状态动画的信息》动画和转换 文章提供了关于创建状态动画的更多信息。
动画 示例演示了如何声明一组基本状态,并在它们之间应用动画过渡。
使用 行为与状态结合使用 Qt Quick 解释了使用 Behaviors 动画状态更改时遇到的一个常见问题。
状态快进
为了让转换正确地动画化状态更改,有时需要引擎在最终应用之前预览和回退状态(即在内部设置和取消状态)。该过程如下
- 将状态预览以确定最终值的集合。
- 回退状态。
- 使用过渡完全应用状态。
在某些情况下,这可能会引起无意的行为。例如,更改视图的 model 或 Loader 的 sourceComponent 的状态将多次设置这些属性(应用、回退,然后重新应用),这可能相对昂贵。
应将状态快进视为实现细节,并且可能会在以后的版本中更改。
© 2024 The Qt Company Ltd. 本文档中包含的文档贡献均为各自所有者的版权。提供的文档是根据自由软件基金会发布的GNU自由文档许可版本1.3许可的。Qt及其相关标志是芬兰及全球其他国家的The Qt Company Ltd.的商标。所有其他商标均为各自所有者的财产。