Qt Quick 状态
相关类型
指定在状态中如何更改项目的锚点 | |
指定在状态变化时如何重新设置项的父级 | |
描述状态的新属性绑定或值 | |
定义对象和属性的配置 | |
指定如何在状态中运行脚本 | |
为非项类型提供内置状态支持 |
许多用户界面设计都是状态驱动的;界面的配置会根据当前状态而有所不同。例如,交通信号灯会根据其状态配置旗帜或灯光。当信号灯处于“stop ”状态时,红灯会亮起,而黄灯和绿灯则会熄灭。 在“caution ”状态下,黄灯亮起,而其他灯则熄灭。
在“State ”状态下,黄色灯亮起,其余灯均熄灭。
- 显示某些 UI 组件并隐藏其他组件
- 向用户呈现不同的可用操作
- 启动、停止或暂停动画
- 执行新状态所需的一些脚本
- 更改特定项的属性值
- 显示不同的视图或屏幕
所有基于Item 的对象都具有state 属性,并可通过将新的State 对象添加到该项的states 属性中来指定额外状态。组件内的每个状态都有一个唯一的name ,默认值为空字符串。要更改某项的当前状态,请将state 属性设置为该状态的名称。
非项对象可通过StateGroup 类型使用状态。
创建状态
要创建状态,请将一个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 { signal.color: "green"}
PropertyChanges { flag.state: "FLAG_DOWN"}
},
State {
name: "CRITICAL"
PropertyChanges { signal.color: "red"}
PropertyChanges { 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 属性将把状态恢复为默认状态。
Rectangle {
id: bell
width: 75; height: 75
color: "yellow"
states: State {
name: "RINGING"
when: (signal.state == "CRITICAL")
PropertyChanges {speaker.play: "RING!"}
}
}每当signal.state 的值为CRITICAL 时,bell 组件将切换至RINGING 状态。
状态变化的动画效果
状态变化会导致值的突然变化。Transition 类型可在状态变化过程中实现更平滑的过渡。在过渡过程中,可以定义动画和插值行为。有关创建状态动画的更多信息,请参阅《动画与过渡》一文。
“动画”示例演示了如何声明一组基本状态,并在它们之间应用动画过渡。
《在状态中使用Qt Quick 行为》一文解释了使用行为(Behaviors)为状态变化添加动画时常遇到的问题。
状态快进
为了使“过渡”能正确地对状态变化进行动画处理,引擎有时需要在最终应用状态之前对其进行快进和回放(即在内部设置和取消该状态)。该过程如下:
- 将状态快进以确定完整的结束值集合。
- 将状态回退。
- 完全应用该状态,并执行过渡效果。
在某些情况下,这可能会导致意外行为。例如,一个会更改视图模型或加载器(Loader)的sourceComponent的状态,将多次设置这些属性(先应用、再回溯、然后重新应用),这可能会消耗较大的资源。
状态快进应被视为实现细节,并在后续版本中可能发生变化。
© 2026 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.