2016-01-24 86 views
2

我想聲明考慮到以前狀態的狀態。是否可以使用PropertyChanges/StateChangeScript之前的州名?Qml項目狀態:以前的狀態

Item { 
    states: [ 
     State { 
      name: "s1" 

      StateChangeScript { 
       if (previous_state == "s2") 
        doSomething(); 
       else 
        doSomethingElse(); 
      } 
     }, 
     State { 
      name: "s2" 
     }, 
     State { 
      name: "s3" 
     } 
    ] 
} 
+2

爲什麼不在改變之前保存當前狀態? '屬性字符串previousState onStateChanged: previousState =狀態' – folibis

+0

我不介意onStateChanged,謝謝 – morte

回答

0

因爲@folibis建議,你可以使用一個屬性來保存以前的狀態。還有另一種方式來做到這一點使用ScriptAction

Item { 
    states: [ 
     State { 
      name: "s1" 
     }, 
     State { 
      name: "s2" 
     }, 
     State { 
      name: "s3" 
     } 
    ] 

    transitions: [ 
     Transition { 
      from: "s2"; to: "s1" 

      ScriptAction { 
       script: doSomething() 
      } 
     }, 
     Transition { 
      from: "s3"; to: "s1" 

      ScriptAction { 
       script: doSomethingElse() 
      } 
     } 
    ] 
} 
1

在研究這個問題,我找到了另一種解決方案可能惠及任性的Google員工在絆此線程。

其他聲明的答案要求您爲每個狀態定義一個轉換,這對於具有多個狀態的較大程序來說變得不方便。

此外,至少在目前QML,

onStateChanged: previousState = state 

導致previousState保持當前狀態,而不是前一個。

所以,我的解決方案:

//within main: 
property string previous_state: "" 
property string current_state: "default_state" 

Transition{ 
    PropertyAction {target: main; property: "previous_state"; value: main.current_state} 
    PropertyAction {target: main; property: "current_state"; value: main.state} 
} 

previous_state會一直保存先前的狀態,並且不需要你定義爲你擁有的每一個狀態過渡新。

一個警告是你必須將current_state設置爲任何默認狀態,所以previous_state在第一次之後是正確的,而不是第二次轉換。