2016-03-28 2 views
4

J'ai une classe C++ et j'ai pu le créer en QML. Ensuite, j'ai un signal en QML qui a un argument représentant cet objet. J'utilise le QtQml.StateMachine et j'attrape des signaux déclenchés avec SignalTransition. Je veux être en mesure de définir mon argument signaux à l'état suivant lorsque le SignalTransition se déclenche. Dans le code:Comment utiliser l'argument d'un Signal dans QML StateMachine lors de SignalTransition

Voici comment mon signal ressemble à Model.qml:

signal mySignal(CustomObject customObject) 

Mon signal de code de transition en 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 
} 

// ... } 

Je reçois l'erreur suivante: ReferenceError: customObject is not defined. Lorsque j'émets le signal, je passe mon customObject comme argument pour le signal.

Répondre

1

Une approche serait d'avoir le gestionnaire mySignal définir une propriété qui peut être sommairement accessible par moins flexible SignalTransition, comme ceci:

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

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

Hacky et non testés, mais peut-être acceptable pour ce cas .

+0

Merci pour votre réponse. Oui, c'est comme ça que je le fais en ce moment et ça fonctionne parfaitement, mais comme vous l'avez dit, c'est un peu hacky et je me demandais s'il y avait une meilleure solution. Par cet exemple: http://doc.qt.io/qt-5/qml-qtqml-statemachine-signaltransition.html#guard-prop il devrait un peu comment fonctionne comme je l'ai écrit dans ma question, mais je reçois toujours le Erreur. – Silex

+0

Bon, alors je ne sais pas. Je pense que pour le code de votre question à travailler, le signal déclenché aurait en quelque sorte porter des arguments du signal de l'appelant, ce qui ne semble pas? –

0

Ceci est un peu un hack, mais le guard est passé les paramètres du signal. Le guard est une expression qui est évaluée pour voir si elle est vraie (et si oui, la transition s'applique) mais rien ne vous empêche d'exécuter du code supplémentaire. Donc:

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