Qt 5.13 | Qt SCXML | Qt SCXML Invoke Example (Static)

Qt 5.13.2 Reference Documentation

# Qt SCXML Invoke Example (Static)

Invokes a compiled nested state machine.

Invoke Example (Static) demonstrates how to use the `<invoke>` element with generated nested state-machines, where the SCXML file is compiled to a C++ class. The `<invoke>` element is used to create an instance of an external service.

#### Running the Example

To run the example from Qt Creator, open the Welcome mode and select the example from Examples. For more information, visit Building and Running an Example.

#### Invoking the State Machine

In statemachine.scxml, we specify a state machine with the name Directions of type http://www.w3.org/TR/scxml/ to invoke:

      <scxml
          xmlns="http://www.w3.org/2005/07/scxml"
          version="1.0"
          name="Directions"
          initial="anyplace"
      >
          <state id="anyplace">
              <transition event="goNowhere" target="nowhere"/>
              <transition event="goSomewhere" target="somewhere"/>

              <state id="nowhere"/>
              <state id="somewhere">
                  <invoke type="http://www.w3.org/TR/scxml/">
                      <content>
                          <scxml name="anywhere" version="1.0">
                              <state id="here">
                                  <transition event="goThere" target="there"/>
                              </state>
                              <state id="there">
                                  <transition event="goHere" target="here"/>
                              </state>
                          </scxml>
                      </content>
                  </invoke>
              </state>
          </state>
      </scxml>

#### Compiling the State Machine

We link against the Qt SCXML module by adding the following line to the invoke-static.pro file:

      QT += qml scxml

We then specify the state machine to compile:

      STATECHARTS = ../invoke-common/statemachine.scxml

The Qt SCXML Compiler, `qscxmlc`, is run automatically to generate statemachine.h and statemachine.cpp, and to add them to the `HEADERS` and `SOURCES` variables for compilation.

#### Instantiating the State Machine

We instantiate the generated `Directions` class in the invoke-static.cpp file, as follows:

      #include "statemachine.h"

      int main(int argc, char *argv[])
      {
          QGuiApplication app(argc, argv);

          qmlRegisterType<Directions>("Directions", 1, 0, "Directions");

          QQmlApplicationEngine engine;
          engine.load(QUrl(QStringLiteral("qrc:/invoke-static.qml")));
          if (engine.rootObjects().isEmpty())
              return -1;

          return app.exec();
      }

Example project @ code.qt.io