qml在状态更改后运行javascript代码

qml在状态更改后运行javascript代码,qml,qtquick2,Qml,Qtquick2,我有几个状态,仅用于更改某些属性: Item { id: props property int someProperty: 0 // ... states: [ State { name: "firstState" PropertyChange { target: props someProperty: 1

我有几个状态,仅用于更改某些属性:

Item {
    id: props
    property int someProperty: 0
    // ...

    states: [
        State {
            name: "firstState"
            PropertyChange {
                target: props
                someProperty: 1
                // ...
            }
        },
        State {
            name: "secondState"
            PropertyChange {
                target: props
                someProperty: 1
                // ...
            }
        }
    ]
    onStateChange: doSomething(someProperty)
}
由于不同的状态可能对
someProperty
具有相同的值,我不能依赖
somePropertyChange
信号,但我甚至不能依赖
onStateChange
(如示例所示),因为当它运行时,属性是不变的


那么,如何在每次状态更改时运行
doSomething()
?有一种更好的方法可以使用
QML

执行此类操作,您可以使用运行一些脚本


您在哪里运行状态应更改的命令?在那里,您还可以执行“doSomething()”方法。此外,您可以使用属性绑定来更改属性-这是更好的方法。QML是一种声明性语言@sk2212我通过应用程序在几个部分运行状态更改命令,因此将
doSomething()
放在任何地方听起来都不是一个好的选择(但我可以创建一个函数来更改状态并运行
doSomething()
,而不是更改状态值)。在实际应用程序中,
someProperty
是触发事件的秒数,如果状态更改,计时器应从一开始就启动(如果两个状态的秒数相同,则不会触发
somePropertyChange
信号,因此计时器不会使用属性绑定重新启动).那么…如何通过应用程序更改状态?是否在其他qml文件中引用id?也许您还应该查看
定时器组件中的
running
属性。同一qml文件的“许多”部分中的状态已更改。当前的问题是,即使秒的值完全相同,当状态发生变化时,我也需要重新启动
计时器
Item {
    id: props
    property int someProperty: 0

    states: [
        State {
            name: "firstState"
            PropertyChanges {
                target: props
                someProperty: 1
            }
            StateChangeScript {
                name: "firstScript"
                script: console.log("entering first state")
            }
        },
        State {
            name: "secondState"
            PropertyChanges {
                target: props
                someProperty: 1
            }
            StateChangeScript {
                name: "secondScript"
                script: console.log("entering second state")
            }
        }
    ]
}
Item {
    id: props
    property int someProperty: 0
    // ...

    states: [
        State {
            name: "firstState"
            PropertyChange {
                target: props
                someProperty: 1
                // ...
            }
        },
        State {
            name: "secondState"
            PropertyChange {
                target: props
                someProperty: 1
                // ...
            }
        }
    ]

    transitions: [
        Transition {
            ScriptAction { 
                script: console.log("transition to " + props.state) 
            }
        }
    ]
}