Roson讲Qt#34 Qt Quick States

绝地灬酷狼 2022-09-12 12:57 246阅读 0赞

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类型的颜色和标志配置对状态进行建模。

  1. Rectangle {
  2. id: signal
  3. width: 200; height: 200
  4. state: "NORMAL"
  5. states: [
  6. State {
  7. name: "NORMAL"
  8. PropertyChanges { target: signal; color: "green"}
  9. PropertyChanges { target: flag; state: "FLAG_DOWN"}
  10. },
  11. State {
  12. name: "CRITICAL"
  13. PropertyChanges { target: signal; color: "red"}
  14. PropertyChanges { target: flag; state: "FLAG_UP"}
  15. }
  16. ]
  17. }

PropertyChanges类型将更改对象属性的值。对象通过其id被引用。组件外部的对象也可以使用id属性来引用,例如外部flag对象的属性更改。

此外,通过将state属性分配给适当的signal状态,state可以改变。状态开关可以是MouseArea类型,当信号接收到鼠标单击时分配不同的状态。

  1. import QtQuick 2.9
  2. import QtQuick.Window 2.2
  3. import QtQuick.Controls 2.2
  4. Window {
  5. visible: true
  6. width: 640
  7. height: 480
  8. title: qsTr("Hello World")
  9. Rectangle {
  10. id: signal
  11. width: 200; height: 200
  12. state: "NORMAL"
  13. states: [
  14. State {
  15. name: "NORMAL"
  16. PropertyChanges { target: signal; color: "green"}
  17. PropertyChanges { target: flag; state: "FLAG_DOWN"}
  18. },
  19. State {
  20. name: "CRITICAL"
  21. PropertyChanges { target: signal; color: "red"}
  22. PropertyChanges { target: flag; state: "FLAG_UP"}
  23. }
  24. ]
  25. MouseArea {
  26. anchors.fill: parent
  27. onClicked: {
  28. if (signal.state == "NORMAL")
  29. signal.state = "CRITICAL"
  30. else
  31. signal.state = "NORMAL"
  32. }
  33. }
  34. }
  35. }

20210925162550344.gif

State类型并不局限于对属性值进行修改。它还可以:

  • 使用StateChangeScript运行一些脚本
  • 使用PropertyChanges覆盖对象的现有信号处理程序
  • 使用ParentChange重新定义一个项目
  • 使用AnchorChanges修改锚值

3.默认状态

每个基于Item的组件都有一个state属性和一个默认状态。默认状态是空字符串(“”),包含项目的所有初始属性值。默认状态对于在状态更改之前管理属性值很有用。将state属性设置为空字符串将加载默认状态。

4.”when”属性

为了方便起见,State类型有一个when属性,该属性可以绑定到表达式,在绑定表达式计算结果为true时更改状态。当表达式计算结果为false时,when属性将状态恢复为默认状态。

  1. Rectangle {
  2. id: bell
  3. width: 75; height: 75
  4. color: "yellow"
  5. states: State {
  6. name: "RINGING"
  7. when: (signal.state == "CRITICAL")
  8. PropertyChanges {target: speaker; play: "RING!"}
  9. }
  10. }

当信号状态为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的状态将多次设置这些属性(应用、倒带,然后重新应用),这可能会相对昂贵。

状态快速转发应该被认为是一个实现细节,在以后的版本中可能会改变。

发表评论

表情:
评论列表 (有 0 条评论,246人围观)

还没有评论,来说两句吧...

相关阅读

    相关 RosonQt #3 QLineEdit

    1.什么是QLineEdit     QLineEdit小部件是一个单行文本编辑器。                     QLineEdit允许用户输入和编辑一行纯