How to add data to SignalTransition in StateMachine
-
Hello.
I have state machine and transitions between states like this:QStateMachine stateMachine; MyState *state1 = new MyState(); MyState *state2 = new MyState(); MyState *state3 = new MyState(); stateMachine.addState(state1); stateMachine.addState(state2); stateMachine.addState(state3); stateMachine.setChildMode(QState::ChildMode::ExclusiveStates); stateMachine.setInitialState(state1); state1->addTransition(state1, &MyState::transitionToState2Required, state2); state1->addTransition(state1, &MyState::transitionToState3Required, state3); state2->addTransition(state2, &MyState::transitionToState3Required, state3); stateMachine.start();
Everything works well, but now i need to transfer some data between states. For example i can use:
MyState::transitionToState3Required(QVariant data);
How i can transfer this data from signal to target state?
-
@Pavel-Romankov said in How to add data to SignalTransition in StateMachine:
How i can transfer this data from signal to target state?
You can use that signal like any other signal in Qt. Connect it to a slot / function in your
MyState
class, that will handle the data and emit / trigger the signal during your current state anytime you want withdata
as argument. -
in my example i have 3 states, so i need make something like:
connect(state1, &MyState::transitionToState2Required, state2, &MyState::onTransitionExecuted); connect(state1, &MyState::transitionToState3Required, state3, &MyState::onTransitionExecuted); connect(state2, &MyState::transitionToState1Required, state1, &MyState::onTransitionExecuted); connect(state2, &MyState::transitionToState3Required, state3, &MyState::onTransitionExecuted); connect(state3, &MyState::transitionToState1Required, state1, &MyState::onTransitionExecuted); connect(state3, &MyState::transitionToState2Required, state2, &MyState::onTransitionExecuted);
but if i have about 10 states I'll need to create about 100 such connections. may be there is any general mechanism?
as i understand, if make like this:
connect(state1, &MyState::transitionToState2Required, state2, &MyState::beforeTransitionExecuted); state1->addTransition(state1, &MyState::transitionToState2Required, state2);
slot beforeTransitionExecuted will called before transition and i can save data in target slot?
and if i make:
state1->addTransition(state1, &MyState::transitionToState2Required, state2); connect(state1, &MyState::transitionToState2Required, state2, &MyState::onTransitionExecuted);
transition will be executed early and only then onTransitionExecuted will be called? so it's better to use first variant?