C
使用状态
相关类型
许多用户界面设计都是 状态驱动的;接口根据当前状态的不同而具有不同的配置。例如,交通信号灯将根据其状态配置其标志或灯光。在信号灯的 停止
状态下,红灯将点亮,而黄灯和绿灯将熄灭。在 警示
状态下,黄灯点亮,而其他灯光熄灭。
在 QML 中,状态 是在 状态 类型中定义的一组属性配置。不同的配置可以如下
- 显示某些 UI 组件并隐藏其他组件
- 向用户展示不同的可用操作
- 启动、停止或暂停动画
- 执行新状态所需的某些脚本
- 更改特定项的属性值
- 显示不同的视图或屏幕
所有 项 基对象如果有 state
属性,则为 .qml
文件的根元素。您可以通过向项的 states 属性添加新的 State
对象来指定其他状态。组件内的每个状态都有一个唯一的 name
(空字符串为默认值)。要更改项的当前状态,请将 state 属性设置为状态的名称。
创建状态
要创建状态,请向项的 states 属性添加一个 State 对象,该属性包含该项的状态列表。
警告信号组件可能具有两种状态,即NORMAL
(正常状态)和CRITICAL
(关键状态)。假设在NORMAL
状态下,信号的颜色应为绿色
,警告标志为下落
。同时,在CRITICAL
状态下,颜色应为红色
,标志为上升
。我们可以使用State
类型来建模状态,并使用PropertyChanges类型来配置颜色和标志。
Rectangle { id: signal width: 200; height: 200 state: "NORMAL" Flag { id: flag } 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被引用。
此外,可以通过将适当的信号状态分配给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
类型不仅可以对属性值进行修改。
- 使用PropertyChanges覆盖对象上的现有信号处理器
- 使用AnchorChanges修改锚点值
默认状态
每个基于Item的组件都有一个state
属性和一个默认状态。默认状态是空字符串(""
),包含一个项的所有初始属性值。默认状态可以在状态更改之前管理属性值。将state
属性设置为空字符串将加载默认状态。
注意:与Qt Quick不同,默认状态不是特殊的。当切换到命名状态时,它不会被更新为组件当前属性和绑定的快照。有关更多信息,请参见默认状态限制
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.state
为CRITICAL
时,bell
组件将转换为RINGING
状态。
动画状态更改
状态更改会引发值的变化。Transition类型允许在状态更改期间更平滑地变化。在转换中,可以定义动画和插值行为。《动画和转换》文章提供了更多关于创建状态动画的详细信息。
在特定的Qt许可证下可用。
了解更多。