Using the Qt SCXML Compiler (qscxmlc)

The qscxmlc tool reads an .scxml file and produces C++ source and header files, containing a class that implements a state machine as defined in SCXML.

Usage

The qscxmlc tool is invoked automatically if the project is linked against the scxml library in the project file, and the .scxml file to use is specified using the special build directives STATECHARTS or qt6_add_statecharts.

When using cmake:

 find_package(Qt6 COMPONENTS Scxml REQUIRED)
 target_link_libraries(mytarget PRIVATE Qt6::Scxml)
 qt6_add_statecharts(mytarget
     MyStatemachine.scxml
 )

When using qmake:

 QT += scxml
 STATECHARTS = MyStatemachine.scxml

With above definitions, qmake or cmake invokes qscxmlc to generate MyStatemachine.h and MyStatemachine.cpp, and adds them appropriately to the project as headers and sources.

By default, the name of the generated class that implements the state machine corresponds with the name attribute of the <scxml> root element.

Command-Line Options

The qscxmlc tool supports the following command-line options, which can be specified using the QSCXMLC_ARGUMENTS variable in the project file:

OptionDescription
--namespace <namespace>Put the generated class(es) in the specified namespace. You can use the QSCXMLC_NAMESPACE variable to specify this in your project file.
-o <base/out/name>The base name of the output files. This can include a path. If none is specified, the basename of the input file is used.
--header <header/out>The name of the output header file. If none is specified, .h is added to the base name.
--impl <cpp/out>The name of the output header file. If none is specified, .cpp is added to the base name.
--classname <StateMachineClassName>The class name of the generated state machine. If none is specified, the value of the name attribute of the <scxml> tag is taken. If that attribute is not specified either, the basename (excluding path) is taken from the input file name.
--statemethodsGenerate extra accessor and signal methods for states. This way you can connect to state changes with plain QObject::connect() and directly call a method to find out if a state is currently active.