如何在QML状态机的SignalTransition中使用Signal的参数

7
我有一个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未定义。当我发出信号时,我将我的customObject作为信号的参数传递。
2个回答

4
这有点像是一个技巧,但 guard 会传递信号参数。 guard 是一个表达式,用于判断其是否为 true(如果是,则应用转换),但是您可以在其中运行额外的代码。因此:
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

一种方法是让mySignal处理程序设置一个属性,可以通过不太灵活的SignalTransition进行总体访问,如下所示:

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

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

这个方法可能不太规范,但对于这种情况可能是可接受的。


谢谢您的回答。是的,这就是我现在正在做的,它完美地工作了,但正如您所说,它有点hacky,我想知道是否有更好的解决方案。根据这个例子:http://doc.qt.io/qt-5/qml-qtqml-statemachine-signaltransition.html#guard-prop,它应该像我在问题中写的那样工作,但我仍然得到错误。 - Silex
好的,那我不知道了。我认为为了使你的代码工作,触发的信号应该从调用者信号中传递参数,但显然它没有这样做? - Jonas G. Drange

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接