1. 程式人生 > >QML影象、狀態和動畫--QML狀態

QML影象、狀態和動畫--QML狀態

所有基於Item的物件都有一個預設狀態,還可以使用專案的states屬性通過新增新的State物件來為其指定附加狀態

每個狀態在一個專案中名稱唯一,要改變狀態,可以將state屬性設定為要改變到的狀態

對於不是Item派生的物件可以通過StateGroup元素來使用狀態

1. 建立狀態

要建立一個狀態,可以向專案的states屬性新增一個State物件,states屬性包含了改專案狀態的列表

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專案定義了在新狀態中所要進行的所有改變,可以指定被改變的附加屬性,或者為其他物件建立附加的PropertyChanges,也可以修改其他物件的屬性,而不僅僅是擁有狀態的物件
State {
            name: "moved"
            PropertyChanges {target: myRect; x: 50; y: 50; color: "green"}  //改變座標
            PropertyChanges {target: someOther; width: 1000}    //其他物件的屬性
}
如果只有一個狀態
states: State {
        ...
}
State 不僅限於對屬性值進行修改,還可以:

使用StateChangeScript執行一些指令碼

使用PropertyChanges為一個物件重寫現有的訊號處理器

使用PropertyChanges為一個專案重定義負專案

使用AnchorChanges修改錨的值

2. 預設狀態

除了進行批量的屬性變化,QML的另一個特色就是可以使專案恢復到預設狀態。在預設狀態中包含了專案所有的初始化屬性值

可以使用when屬性來實現

Rectangle {
   ...
   MouseArea {
        id: mouseArea
        anchors.fill: parent
   }
   states: State {
        name: "moved"; when: mouseArea.pressed
        ...
   }
}
當when屬性設定的表示式值為true時,專案會設定為該狀態。另外,一個專案可以為其state屬性指定一個空字串來明確地將其狀態設定為預設狀態。
Rectangle {
    ...
    MouseArea {
        anchors.fill: parent
        onPressed: myRect.state = "moved";
        onReleased: myRect.state = "";
    }
    states: State {
        name: "moved"
        ...
   }
}
使用when屬性比使用訊號處理器來分配狀態更加簡單,更符合宣告式的語言。所以建議在這種情況下使用前面when屬性的方法。