2016-03-28 13 views
4

Ich habe eine C++ - Klasse und ich machte es möglich, in QML erstellen zu können. Dann habe ich ein Signal in QML, das ein Argument für dieses Objekt hat. Ich verwende die QtQml.StateMachine und ich fange getriggerte Signale mit SignalTransition. Ich möchte in der Lage sein, mein Signal-Argument auf den nächsten Zustand zu setzen, wenn der SignalTransition auslöst. In Code:So verwenden Sie das Argument eines Signals in QML StateMachine während SignalTransition

Dies ist, wie mein Signal wie in Model.qml aussieht:

signal mySignal(CustomObject customObject) 

Mein Signal transitioning Code in 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 
} 

// ... } 

bekomme ich folgende Fehlermeldung: ReferenceError: customObject is not defined. Wenn ich das Signal ausliege, übergebe ich mein customObject als Argument für das Signal.

Antwort

1

Ein Ansatz wäre die mySignal Handler eine Eigenschaft festgelegt zu haben, die von den weniger flexiblen SignalTransition, wie so zugegriffen werden zusammenfassend kann:

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

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

Hacky und nicht getestet, aber könnte für diesen Fall akzeptabel sein .

+0

Danke für Ihre Antwort. Ja, so mache ich es jetzt und es funktioniert perfekt, aber wie du gesagt hast ist es ein wenig hacky und hat sich gefragt, ob es eine bessere Lösung gibt. Durch dieses Beispiel: http://doc.qt.io/qt-5/qml-qtqml-statemachine-signaltransition.html#guard-prop sollte es einige funktionieren wie ich es in meiner Frage geschrieben habe, aber ich bekomme immer noch die Error. – Silex

+0

Richtig, dann weiß ich nicht. Ich denke, für den Code, den Ihre Frage zu arbeiten, würde das ausgelöste Signal irgendwie Argumente aus dem Anrufer-Signal, die es offenbar nicht trägt? –

0

Dies ist ein bisschen ein Hack, aber die guard ist die Signalparameter übergeben. Der ist ein Ausdruck, der ausgewertet wird, um zu sehen, ob er wahr ist (und wenn ja, der Übergang gilt), aber es gibt nichts, was Sie daran hindert, zusätzlichen Code dort zu laufen. Also:

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; 
    } 
}