Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. How to add data to SignalTransition in StateMachine
Forum Updated to NodeBB v4.3 + New Features

How to add data to SignalTransition in StateMachine

Scheduled Pinned Locked Moved Unsolved General and Desktop
3 Posts 2 Posters 447 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • P Offline
    P Offline
    Pavel Romankov
    wrote on last edited by Pavel Romankov
    #1

    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?

    Pl45m4P 1 Reply Last reply
    0
    • P Pavel Romankov

      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?

      Pl45m4P Offline
      Pl45m4P Offline
      Pl45m4
      wrote on last edited by Pl45m4
      #2

      @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 with data as argument.


      If debugging is the process of removing software bugs, then programming must be the process of putting them in.

      ~E. W. Dijkstra

      1 Reply Last reply
      1
      • P Offline
        P Offline
        Pavel Romankov
        wrote on last edited by
        #3

        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?

        1 Reply Last reply
        0

        • Login

        • Login or register to search.
        • First post
          Last post
        0
        • Categories
        • Recent
        • Tags
        • Popular
        • Users
        • Groups
        • Search
        • Get Qt Extensions
        • Unsolved