Qml项状态:上一个状态

4

我想声明一些考虑到之前状态的状态。在PropertyChanges/StateChangeScript中使用之前的状态名称是否可行?

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

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

3
为什么不在改变状态之前先保存当前状态呢? 属性字符串 previousState onStateChanged: previousState = state - folibis
我不介意在onStateChanged时发生,谢谢。 - morte
2个回答

2
在研究这个问题时,我找到了另一种解决方案,可能会对偶然发现这个线程的谷歌用户有好处。
另一个答案要求你为每个状态定义一个转换,这对于拥有许多状态的较大程序变得不方便。
此外,至少目前在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 是正确的。


1

正如@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()
            }
        }
    ]
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接