我有一个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作为信号的参数传递。
答案 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并没有经过测试,但在这种情况下可能是可以接受的。