如何在SignalTransition期间在QML StateMachine中使用Signal的参数

时间:2016-03-28 14:33:57

标签: qt qml qt-signals

我有一个C ++类,我可以用QML创建它。然后我在QML中有一个信号,它有一个表示该对象的参数。我正在使用QtQml.StateMachine,我正在使用SignalTransition捕获触发信号。我希望能够在SignalTransition触发时将我的信号参数设置为下一个状态。在代码中:

这就是我的信号在Model.qml中的样子:

signal mySignal(CustomObject customObject)

我在State.qml中转换代码的信号:

import QtQml.StateMachine 1.0 as SM

// SM.State { ...

Model {
    id: model
    // ...
}

SM.SignalTransition {
    targetState: nextState
    signal: model.mySignal
    onTriggered: console.log(customObject) // error here
}

// ... } 

我收到以下错误:ReferenceError: customObject is not defined。 当我发出信号时,我将我的customObject作为信号的参数传递。

2 个答案:

答案 0 :(得分:2)

这有点像黑客,但guard传递了信号的参数。 guard是一个表达式,它被评估以确定它是否为真(如果是,则应用转换)但是没有什么能阻止你在那里运行额外的代码。所以:

State {
    targetState: nextState
    signal: model.mySignal
    guard: {
        // here, customObject is available, because it was an arg to the signal
        // so, stash it away somewhere where you can get at it later
        root.currentCustomObject = customObject;
        // and explicitly return true, so that this guard passes OK and
        // then the transition actually happens
        return true;
    }
}

答案 1 :(得分:1)

一种方法是让mySignal处理程序设置一个属性,该属性可由不太灵活的SignalTransition简单地访问,如下所示:

Model {
    id: model
    property CustomObject currentObj
    onMySignal: currentObj = customObject
}

SM.SignalTransition {
    targetState: nextState
    signal: model.currentObjChanged
    onTriggered: console.log(model.currentObj)
}

Hacky并没有经过测试,但在这种情况下可能是可以接受的。