【问题标题】:qml run javascript code after state changeqml在状态改变后运行javascript代码
【发布时间】:2015-11-19 08:36:14
【问题描述】:

我有几个状态,我只用来更改一些属性:

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() 放在任何地方听起来不是一个好的选择(但我可以创建一个更改状态并运行@ 987654328@ 而不是改变 state 的值)。在实际应用程序中,someProperty 是触发事件的秒数,如果状态更改,计时器应该从头开始(如果两个状态的秒数相同,则不会触发 somePropertyChange 信号,因此计时器不会通过使用属性绑定重新启动)。
  • 嗯...如何通过应用程序更改状态?引用其他 qml 文件中的 id?也许您还应该查看Timer 组件中的running 属性。
  • 同一个 qml 文件的“许多”部分的状态发生了变化。手头的问题是,即使秒的值完全相同,我也需要在状态更改时重新启动Timer

标签: qml qtquick2


【解决方案1】:

您可以使用StateChangeScript 运行一些脚本。

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")
            }
        }
    ]
}

【讨论】:

  • 但是使用这个解决方案我需要在每个州内放置一个 StateChangeScript
【解决方案2】:
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) 
            }
        }
    ]
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    • 2013-03-28
    相关资源
    最近更新 更多