Qml 当状态被替换时做一些事情

Qml 当状态被替换时做一些事情,qml,qtquick2,qt-quick,qtquickcontrols,qtquickcontrols2,Qml,Qtquick2,Qt Quick,Qtquickcontrols,Qtquickcontrols2,我想在特定状态退出时更改一些属性或运行脚本 在形式上,我将使用一个变量来保存以前的状态。当状态更改时,检查以前的状态并确定是否运行脚本。但随着状态数的增加,代码将变得更加冗余。我如何简化这一点 e、 g.如何简化以下代码 Item { property var work property var preState states: [ State { name: "state1"; ... },

我想在特定状态退出时更改一些属性或运行脚本

在形式上,我将使用一个变量来保存以前的状态。当状态更改时,检查以前的状态并确定是否运行脚本。但随着状态数的增加,代码将变得更加冗余。我如何简化这一点

e、 g.如何简化以下代码

Item {
    property var work
    property var preState
    states: [
        State {
            name: "state1";
            ...
        },
        State {
            name: "state2";
            ...
        }
        ...
        State {
            name: "stateN";
            ...
        }
    ]
    onStateChanged: {
        if (preState == "state1") {
            ...
        } else if (preState == "state2") {
            ...
        } else if (preState == "stateN") {
            ...
        }
    }
    ...
}

您可以使用onStateChanged信号进行此操作

Item {
    id:stateTest
    property var work
    property var prevState
    states: [
        State {
            name: "state1";

        },
        State {
            name: "state2";

        },

        State {
            name: "stateN";

        }
    ]

    onStateChanged: {

        work="whatever"

       prevState=state
    }

    Component.onCompleted: prevState=state
}

如果您希望尽可能使用它作为声明性的,您将避免在状态更改中使用脚本。相反,您可以声明,当输入新的
状态时,应该更改什么

为此,您可以提供一个元素列表

您还可以使用专门的
更改更改更改
来更改
锚定
和父级
父级
。如果需要运行脚本,正确的方法是使用元素

要设置更改的动画,请添加
Transition
s

您可以找到有关
State
s用法的更多信息

语法非常简单:

State {
    name: 'myState1'
    PropertyChanges { target: root; color: 'green' }
    AnchorChanges { target: child; anchors.top: root.bottom }
    // ... some more if necessary ...
}
使用
Changes
的好处是,如果在脚本中设置,结果会自动成为绑定,而不是赋值。(无
Qt.binding(…)