1.State
所有组件均具有默认状态,该状态定义对象和属性值的默认配置。可以通过向States属性添加State组件来定义新状态,以允许组件在不同配置之间切换.
许多用户界面设计都是由State状态实现的,比如: 交通信号将根据其State配置来实现红黄绿灯交错亮灭.
在QML中,状态是在State对象中定义的一组属性配置。例如,下面几种用State状态最为方便:
所有基于Item的对象都有一个states属性和state属性:
对于非Item对象可以通过StateGroup组件配合来使用State即可
1.1 State对象属性
1.2 Change对象
当一个对象的状态发生改变,那么该对象展示给用户的效果也会相应发生改变,所以State支持了多个不同Change对象供我们使用,有如下几种:
由于帮助手册都有很多示例,所以我们以PropertyChanges为例,来实现一个交通灯
1.3 交通灯示例
我们以交通信号为例,根据其State配置来实现红黄绿灯交错亮灭.效果如下所示:
代码如下所示:
Window { width: 300; height: 400; visible: true; property var delayCnt: 0 Rectangle { anchors.fill: parent gradient: Gradient { GradientStop { position: 0.0; color: "#14148c" } GradientStop { position: 0.699; color: "#14aaff" } GradientStop { position: 0.7; color: "#80c342" } GradientStop { position: 1.0; color: "#006325" } } } Canvas { id: canvas anchors.centerIn: parent width: 80 height: 300 onPaint: { var ctx = getContext("2d") ctx.fillStyle = "black" ctx.fillRect(0,0,width,height-90) ctx.fillRect(width/2 -15,height-90,30,90) } } Column { id: leds anchors.centerIn: canvas anchors.verticalCenterOffset: -45 spacing: 15 state: delayCnt < 5 ? "red" : delayCnt < 10 ? "green" : delayCnt < 14 ? (delayCnt%2==0 ? "green" : "") : "yellow"; Rectangle { id : redLed width: 50; height:50 radius: width/2 color: "red" opacity: 0.2 } Rectangle { id : yellowLed width: 50; height:50 radius: width/2 color: "yellow" opacity: 0.2 } Rectangle { id : greenLed width: 50; height:50 radius: width/2 color: "green" opacity: 0.2 } states: [ State { name: "red" PropertyChanges { target: redLed; opacity: 1} }, State { name: "yellow" PropertyChanges { target: yellowLed; opacity: 1} }, State { name: "green" PropertyChanges { target: greenLed; opacity: 1} } ] } Timer { interval: 500 repeat: true running: true onTriggered: { delayCnt = (delayCnt+1)%18 console.log(delayCnt,leds.state) } } }
2.Transition
Transition用来当State发生改变时产生的一个过渡动画(有Transition的地方就会有State出现),使得状态改变更加平滑。
并且所有基于Item的对象都有一个transitions属性,是一个list<Transition>类型,保存着该对象所有的Transtion,只要当该对象的state发生改变时,就会去遍历transitions属性,如果有满足条件的,则产生一个过渡动画.
给transitions赋值和给states赋值一样,假如只有一个Transition,那么我们可以直接这样写:
transitions: Transition {
... ...
}
假如有多个Tansition,可以这样写:
transitions: [
Transition {
... ...
},
Transition {
... ...
}
]
2.1 Transition对象属性
2.2 使用串行动画时注意
2.3 在交通灯基础上添加过渡动画
我们在上个示例的leds对象中添加下面代码:
transitions: Transition { PropertyAnimation { target: redLed; property: "opacity"; duration: 400} PropertyAnimation { target: yellowLed; property: "opacity"; duration: 400} PropertyAnimation { target: greenLed; property: "opacity"; duration: 400} }
最终效果如下所示:
27.Qt Quick QML-State、Transition
原文:https://www.cnblogs.com/lifexy/p/14854427.html