Qml项目状态:以前的状态

问题描述:

我想声明考虑到以前状态的状态。是否可以使用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

因为@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() 
      } 
     } 
    ] 
} 

在研究这个问题,我找到了另一种解决方案可能惠及任性的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在第一次之后是正确的,而不是第二次转换。