Roson讲Qt#34 Qt Quick States
1.有关的类型
AnchorChanges | Specifies how to change the anchors of an item in a state | 指定如何更改处于某种状态的项的锚 |
ParentChange | Specifies how to reparent an Item in a state change | 指定如何在状态更改中重新创建项目 |
PropertyChanges | Describes new property bindings or values for a state | 描述状态的新属性绑定或值 |
State | Defines configurations of objects and properties | 定义对象和属性的配置 |
StateChangeScript | Specifies how to run a script in a state | 指定如何在某个状态下运行脚本 |
StateGroup | Provides built-in state support for non-Item types | 为非item类型提供内置状态支持 |
许多用户界面设计是由状态驱动的;接口的配置会因当前状态的不同而不同。例如,一个交通信号将根据它的状态配置它的标志或灯。当信号灯处于停止状态时,红灯将亮起,黄灯和绿灯将熄灭。在“警告”状态下,黄灯亮,其他灯关闭。在QML中,状态是在State类型中定义的一组属性配置。例如:
- 显示一些UI组件
- 隐藏其他组件向用户显示不同的可用操作
- 启动、停止或暂停动画
- 在新状态下执行一些脚本
- 更改特定项目的属性值
- 显示不同的视图或屏幕
所有基于Item的对象都有一个state属性,并且可以通过向item的state属性添加新的state对象来指定额外的状态。组件中的每个状态都有一个唯一的名称,默认为一个空字符串。若要更改item的当前状态,请将state属性设置为状态的名称。非item对象可以通过StateGroup类型使用状态。
2.创建状态(state)
要创建一个状态,请将state对象添加到item的states属性中,该属性包含该项目的状态列表。警告信号组件可能有两种状态,正常(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属性分配给适当的signal状态,state可以改变。状态开关可以是MouseArea类型,当信号接收到鼠标单击时分配不同的状态。
import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Controls 2.2
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
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"}
}
]
MouseArea {
anchors.fill: parent
onClicked: {
if (signal.state == "NORMAL")
signal.state = "CRITICAL"
else
signal.state = "NORMAL"
}
}
}
}
State类型并不局限于对属性值进行修改。它还可以:
- 使用StateChangeScript运行一些脚本
- 使用PropertyChanges覆盖对象的现有信号处理程序
- 使用ParentChange重新定义一个项目
- 使用AnchorChanges修改锚值
3.默认状态
每个基于Item的组件都有一个state属性和一个默认状态。默认状态是空字符串(“”),包含项目的所有初始属性值。默认状态对于在状态更改之前管理属性值很有用。将state属性设置为空字符串将加载默认状态。
4.”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!"}
}
}
当信号状态为CRITICAL时,bell组件将变为RINGING状态。
5.改变动画状态(Animating State Changes)
状态的变化会引起突变值的变化。Transition类型允许在状态更改期间更平稳地更改。在过渡中,动画和插值行为是可定义的。动画和过渡文章有更多关于创建状态动画的信息。
States and Transitions example演示了如何声明一组基本状态并在它们之间应用动画转换。
Using Qt Quick Behaviors with States解释了使用行为动画状态更改时的一个常见问题。
6.快进状态(State Fast Forwarding)
为了让Transition能够正确地动画状态变化,有时候引擎需要在最终应用状态之前快速前进和后退(也就是说,在内部设置和取消设置)。流程如下:
1.状态被快速转发以确定完整的结束值集。
2.状态被倒带。
3.通过转换,状态被完全应用。
在某些情况下,这可能会导致意想不到的行为。例如,更改视图模型或Loader的sourceComponent的状态将多次设置这些属性(应用、倒带,然后重新应用),这可能会相对昂贵。
状态快速转发应该被认为是一个实现细节,在以后的版本中可能会改变。
还没有评论,来说两句吧...