QML 笔记

State

配合使用:state、states、PropertyChanges。

Item 属性:state 当前状态,states 定义所有状态。

非 Item 对象通过 StateGroup 来使用 State。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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"}
}
]
}

when 属性:

1
2
3
4
5
6
7
8
9
10
11
Rectangle {
id: bell
width: 75; height: 75
color: "yellow"

states: State {
name: "RINGING"
when: (signal.state == "CRITICAL")
PropertyChanges {target: speaker; play: "RING!"}
}
}

Animations

Animations:为属性应用动画

Transition 配合 Animations:为状态切换应用动画

直接属性动画(Direct Property Animation)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Rectangle {
id: flashingblob
width: 75; height: 75
color: "blue"
opacity: 1.0

MouseArea {
anchors.fill: parent
onClicked: {
animateColor.start()
animateOpacity.start()
}
}

PropertyAnimation {id: animateColor; target: flashingblob; properties: "color"; to: "green"; duration: 100}

NumberAnimation {
id: animateOpacity
target: flashingblob
properties: "opacity"
from: 0.99
to: 1.0
loops: Animation.Infinite
easing {type: Easing.OutBack; overshoot: 500}
}
}

on 语法

1
2
3
4
5
6
7
8
Rectangle {
id: rect
width: 100; height: 100
color: "red"

PropertyAnimation on x { to: 100 }
PropertyAnimation on y { to: 100 }
}
1
2
3
4
5
6
7
8
9
Rectangle {
width: 100; height: 100
color: "red"

SequentialAnimation on color {
ColorAnimation { to: "yellow"; duration: 1000 }
ColorAnimation { to: "blue"; duration: 1000 }
}
}

State 过渡动画

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Rectangle {
width: 75; height: 75
id: button
state: "RELEASED"

MouseArea {
anchors.fill: parent
onPressed: button.state = "PRESSED"
onReleased: button.state = "RELEASED"
}

states: [
State {
name: "PRESSED"
PropertyChanges { target: button; color: "lightblue"}
},
State {
name: "RELEASED"
PropertyChanges { target: button; color: "lightsteelblue"}
}
]

transitions: [
Transition {
from: "PRESSED"
to: "RELEASED"
ColorAnimation { target: button; duration: 100}
},
Transition {
from: "RELEASED"
to: "PRESSED"
ColorAnimation { target: button; duration: 100}
}
]
}

使用通配符:

1
2
3
4
5
transitions:
Transition {
to: "*"
ColorAnimation { target: button; duration: 100}
}

通过 Behavior 为属性指定默认动画

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Rectangle {
width: 75; height: 75; radius: width
id: ball
color: "salmon"

Behavior on x {
NumberAnimation {
id: bouncebehavior
easing {
type: Easing.OutElastic
amplitude: 1.0
period: 0.5
}
}
}
Behavior on y {
animation: bouncebehavior
}
Behavior {
ColorAnimation { target: ball; duration: 100 }
}
}

SequentialAnimation 和 ParallelAnimation

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Rectangle {
id: banner
width: 150; height: 100; border.color: "black"

Column {
anchors.centerIn: parent
Text {
id: code
text: "Code less."
opacity: 0.01
}
Text {
id: create
text: "Create more."
opacity: 0.01
}
Text {
id: deploy
text: "Deploy everywhere."
opacity: 0.01
}
}

MouseArea {
anchors.fill: parent
onPressed: playbanner.start()
}

SequentialAnimation {
id: playbanner
running: false
NumberAnimation { target: code; property: "opacity"; to: 1.0; duration: 200}
NumberAnimation { target: create; property: "opacity"; to: 1.0; duration: 200}
NumberAnimation { target: deploy; property: "opacity"; to: 1.0; duration: 200}
}
}

其他动画相关类型

  • PauseAnimation
  • ScriptAction
  • PropertyAction
  • SmoothedAnimation
  • SpringAnimation
  • ParentAnimation
  • AnchorAnimation