QML影象、狀態和動畫--QML狀態
阿新 • • 發佈:2019-02-06
所有基於Item的物件都有一個預設狀態,還可以使用專案的states屬性通過新增新的State物件來為其指定附加狀態
每個狀態在一個專案中名稱唯一,要改變狀態,可以將state屬性設定為要改變到的狀態
對於不是Item派生的物件可以通過StateGroup元素來使用狀態
1. 建立狀態
要建立一個狀態,可以向專案的states屬性新增一個State物件,states屬性包含了改專案狀態的列表
State專案定義了在新狀態中所要進行的所有改變,可以指定被改變的附加屬性,或者為其他物件建立附加的PropertyChanges,也可以修改其他物件的屬性,而不僅僅是擁有狀態的物件import QtQuick 2.4 Rectangle { id: myRect width: 200; height: 200 color: "red" MouseArea { anchors.fill: parent onClicked: myRect.state = "moved" //改變狀態,改變座標 } states: [ //定義狀態 State { name: "moved" PropertyChanges {target: myRect; x: 50; y: 50} //改變座標 } ] }
State {
name: "moved"
PropertyChanges {target: myRect; x: 50; y: 50; color: "green"} //改變座標
PropertyChanges {target: someOther; width: 1000} //其他物件的屬性
}
如果只有一個狀態
State 不僅限於對屬性值進行修改,還可以:states: State { ... }
使用StateChangeScript執行一些指令碼
使用PropertyChanges為一個物件重寫現有的訊號處理器
使用PropertyChanges為一個專案重定義負專案
使用AnchorChanges修改錨的值
2. 預設狀態
除了進行批量的屬性變化,QML的另一個特色就是可以使專案恢復到預設狀態。在預設狀態中包含了專案所有的初始化屬性值
可以使用when屬性來實現
當when屬性設定的表示式值為true時,專案會設定為該狀態。另外,一個專案可以為其state屬性指定一個空字串來明確地將其狀態設定為預設狀態。Rectangle { ... MouseArea { id: mouseArea anchors.fill: parent } states: State { name: "moved"; when: mouseArea.pressed ... } }
Rectangle {
...
MouseArea {
anchors.fill: parent
onPressed: myRect.state = "moved";
onReleased: myRect.state = "";
}
states: State {
name: "moved"
...
}
}
使用when屬性比使用訊號處理器來分配狀態更加簡單,更符合宣告式的語言。所以建議在這種情況下使用前面when屬性的方法。