QScxmlStateMachine Class | Qt SCXML 6.8.0
Description: The QScxmlStateMachine class provides an interface to the state machines created from SCXML files.

- Qt 6.8
- Qt SCXML
- C++ Classes
- QScxmlStateMachine
- Qt 6.8.0 Reference Documentation

# QScxmlStateMachine Class

The QScxmlStateMachine class provides an interface to the state machines created from SCXML files. More...

Header: | `#include <QScxmlStateMachine>`
CMake: | `find_package(Qt6 REQUIRED COMPONENTS Scxml)` `target_link_libraries(mytarget PRIVATE Qt6::Scxml)`
qmake: | `QT += scxml`
In QML: | ScxmlStateMachine
Inherits: | QObject

- List of all members, including inherited members

## Properties

dataModel : QScxmlDataModel* initialValues : QVariantMap initialized : bool invoked : const bool invokedServices : QList<QScxmlInvokableService*> loader : QScxmlCompiler::Loader* | name : const QString parseErrors : const QList<QScxmlError> running : bool sessionId : const QString tableData : QScxmlTableData*

## Public Functions

QStringList | activeStateNames(bool compress = true) const
QBindable<QScxmlDataModel *> | bindableDataModel()
QBindable<QVariantMap> | bindableInitialValues()
QBindable<bool> | bindableInitialized() const
QBindable<QList<QScxmlInvokableService *>> | bindableInvokedServices()
QBindable<QScxmlCompiler::Loader *> | bindableLoader()
QBindable<QScxmlTableData *> | bindableTableData()
void | cancelDelayedEvent(const QString &sendId)
QMetaObject::Connection | connectToEvent(const QString &scxmlEventSpec, Functor &&functor, Qt::ConnectionType type = Qt::AutoConnection)
QMetaObject::Connection | connectToEvent(const QString &scxmlEventSpec, const QObject *context, Functor &&functor, Qt::ConnectionType type = Qt::AutoConnection)
QMetaObject::Connection | connectToEvent(const QString &scxmlEventSpec, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)
QMetaObject::Connection | connectToState(const QString &scxmlStateName, Functor &&functor, Qt::ConnectionType type = Qt::AutoConnection)
QMetaObject::Connection | connectToState(const QString &scxmlStateName, const QObject *context, Functor &&functor, Qt::ConnectionType type = Qt::AutoConnection)
QMetaObject::Connection | connectToState(const QString &scxmlStateName, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)
QScxmlDataModel * | dataModel() const
QVariantMap | initialValues()
QList<QScxmlInvokableService *> | invokedServices() const
bool | isActive(const QString &scxmlStateName) const
bool | isDispatchableTarget(const QString &target) const
bool | isInitialized() const
bool | isInvoked() const
bool | isRunning() const
QScxmlCompiler::Loader * | loader() const
QString | name() const
QList<QScxmlError> | parseErrors() const
QString | sessionId() const
void | setDataModel(QScxmlDataModel *model)
void | setInitialValues(const QVariantMap &initialValues)
void | setLoader(QScxmlCompiler::Loader *loader)
void | setRunning(bool running)
void | setTableData(QScxmlTableData *tableData)
QStringList | stateNames(bool compress = true) const
void | submitEvent(QScxmlEvent *event)
void | submitEvent(const QString &eventName)
void | submitEvent(const QString &eventName, const QVariant &data)
QScxmlTableData * | tableData() const

## Public Slots

bool | init()
void | start()
void | stop()

## Signals

void | dataModelChanged(QScxmlDataModel *model)
void | finished()
void | initialValuesChanged(const QVariantMap &initialValues)
void | initializedChanged(bool initialized)
void | invokedServicesChanged(const QList<QScxmlInvokableService *> &invokedServices)
void | loaderChanged(QScxmlCompiler::Loader *loader)
void | log(const QString &label, const QString &msg)
void | reachedStableState()
void | runningChanged(bool running)
void | tableDataChanged(QScxmlTableData *tableData)

## Static Public Members

QScxmlStateMachine * | fromData(QIODevice *data, const QString &fileName = QString())
QScxmlStateMachine * | fromFile(const QString &fileName)
std::function<void (bool)> | onEntry(Functor functor)
std::function<void (bool)> | onEntry(const QObject *receiver, const char *method)
std::function<void (bool)> | onEntry(const typename QtPrivate::FunctionPointer<PointerToMemberFunction>::Object *receiver, PointerToMemberFunction method)
std::function<void (bool)> | onExit(Functor functor)
std::function<void (bool)> | onExit(const QObject *receiver, const char *method)
std::function<void (bool)> | onExit(const typename QtPrivate::FunctionPointer<PointerToMemberFunction>::Object *receiver, PointerToMemberFunction method)

## Protected Functions

bool | isActive(int stateIndex) const

## Detailed Description

QScxmlStateMachine is an implementation of the State Chart XML (SCXML).

All states that are defined in the SCXML file are accessible as properties of QScxmlStateMachine. These properties are boolean values and indicate whether the state is active or inactive.

Note: The QScxmlStateMachine needs a QEventLoop to work correctly. The event loop is used to implement the `delay` attribute for events and to schedule the processing of a state machine when events are received from nested (or parent) state machines.

## Property Documentation

### `[bindable]` dataModel : QScxmlDataModel*

Note: This property supports QProperty bindings.

This property holds the data model to be used for this state machine.

SCXML data models are described in SCXML Specification - 5 Data Model and Data Manipulation. For more information about supported data models, see SCXML Compliance.

Changing the data model when the state machine has been `initialized` is not specified in the SCXML standard and leads to undefined behavior.

See also QScxmlDataModel, QScxmlNullDataModel, and QScxmlCppDataModel.

### `[bindable]` initialValues : QVariantMap

Note: This property supports QProperty bindings.

This property holds the initial values to be used for setting up the data model.

See also QScxmlStateMachine::init() and QScxmlDataModel.

### `[bindable read-only]` initialized : bool

Note: This property supports QProperty bindings.

This property holds whether the state machine has been initialized.

It is `true` if the state machine has been initialized, `false` otherwise.

See also QScxmlStateMachine::init() and QScxmlDataModel.

### `[read-only]` invoked : const bool

This property holds whether the state machine was invoked from an outer state machine.

`true` when the state machine was started as a service with the `<invoke>` element, `false` otherwise.

Access functions:

bool | isInvoked() const

### `[bindable read-only]` invokedServices : QList<QScxmlInvokableService*>

Note: This property supports QProperty bindings.

This property holds a list of SCXML services that were invoked from the main state machine (possibly recursively).

### `[bindable]` loader : QScxmlCompiler::Loader*

Note: This property supports QProperty bindings.

This property holds the loader that is currently used to resolve and load URIs for the state machine.

### `[read-only]` name : const QString

This property holds the name of the state machine as set by the name attribute of the `<scxml>` tag.

Access functions:

QString | name() const

### `[read-only]` parseErrors : const QList<QScxmlError>

This property holds the list of parse errors that occurred while creating a state machine from an SCXML file.

Access functions:

QList<QScxmlError> | parseErrors() const

### running : bool

This property holds the running state of this state machine

Access functions:

bool | isRunning() const
void | setRunning(bool running)

Notifier signal:

void | runningChanged(bool running)

See also start().

### `[read-only]` sessionId : const QString

This property holds the session ID of the current state machine.

The session ID is used for message routing between parent and child state machines. If a state machine is started by an `<invoke>` element, any event it sends will have the `invokeid` field set to the session ID. The state machine will use the origin of an event (which is set by the target or targetexpr attribute in a `<send>` element) to dispatch messages to the correct child state machine.

Access functions:

QString | sessionId() const

See also QScxmlEvent::invokeId().

### `[bindable]` tableData : QScxmlTableData*

Note: This property supports QProperty bindings.

This property holds the table data that is used when generating C++ from an SCXML file.

The class implementing the state machine will use this property to assign the generated table data. The state machine does not assume ownership of the table data.

## Member Function Documentation

### template <typename Functor> QMetaObject::Connection QScxmlStateMachine::connectToEvent(const QString &scxmlEventSpec, Functor &&functor, Qt::ConnectionType type = Qt::AutoConnection)

### template <typename Functor> QMetaObject::Connection QScxmlStateMachine::connectToEvent(const QString &scxmlEventSpec, const QObject *context, Functor &&functor, Qt::ConnectionType type = Qt::AutoConnection)

Creates a connection of the given type from the event specified by scxmlEventSpec to functor, which can be a functor or a member function of the optional context object.

The receiver's functor must take a QScxmlEvent as a parameter.

In contrast to event specifications in SCXML documents, spaces are not allowed in the scxmlEventSpec here. In order to connect to multiple events with different prefixes, connectToEvent() has to be called multiple times.

Returns a handle to the connection, which can be used later to disconnect.

### template <typename Functor> QMetaObject::Connection QScxmlStateMachine::connectToState(const QString &scxmlStateName, Functor &&functor, Qt::ConnectionType type = Qt::AutoConnection)

### template <typename Functor> QMetaObject::Connection QScxmlStateMachine::connectToState(const QString &scxmlStateName, const QObject *context, Functor &&functor, Qt::ConnectionType type = Qt::AutoConnection)

Creates a connection of the given type from the state specified by scxmlStateName to functor, which can be a functor or a member function of the optional context object.

The receiver's functor must take a boolean argument that indicates whether the state connected became active or inactive.

Returns a handle to the connection, which can be used later to disconnect.

### `[invokable]` QStringList QScxmlStateMachine::activeStateNames(bool compress = true) const

Retrieves a list of state names of all active states.

When a state is active, all its parent states are active by definition. When compress is `true` (the default), the parent states will be filtered out and only the leaf states will be returned. When it is `false`, the full list of active states will be returned.

Note: This function can be invoked via the meta-object system and from QML. See Q_INVOKABLE.

### `[invokable]` void QScxmlStateMachine::cancelDelayedEvent(const QString &sendId)

Cancels a delayed event with the specified sendId.

Note: This function can be invoked via the meta-object system and from QML. See Q_INVOKABLE.

### QMetaObject::Connection QScxmlStateMachine::connectToEvent(const QString &scxmlEventSpec, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)

Creates a connection of the specified type from the event specified by scxmlEventSpec to the method in the receiver object. The receiver's method may take a QScxmlEvent as a parameter. For example:

     void mySlot(const QScxmlEvent &event);

In contrast to event specifications in SCXML documents, spaces are not allowed in the scxmlEventSpec here. In order to connect to multiple events with different prefixes, connectToEvent() has to be called multiple times.

Returns a handle to the connection, which can be used later to disconnect.

### QMetaObject::Connection QScxmlStateMachine::connectToState(const QString &scxmlStateName, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)

Creates a connection of the given type from the state identified by scxmlStateName to the method in the receiver object. The receiver's method may take a boolean argument that indicates whether the state connected became active or inactive. For example:

     void mySlot(bool active);

Returns a handle to the connection, which can be used later to disconnect.

### QScxmlDataModel *QScxmlStateMachine::dataModel() const

Returns the data model used by the state machine.

Note: Getter function for property dataModel.

See also setDataModel().

### `[signal]` void QScxmlStateMachine::finished()

This signal is emitted when the state machine reaches a top-level final state.

See also running.

### `[static]` QScxmlStateMachine *QScxmlStateMachine::fromData(QIODevice *data, const QString &fileName = QString())

Creates a state machine by reading from the QIODevice specified by data.

This method will always return a state machine. If errors occur while reading the SCXML file, fileName, the state machine cannot be started. The errors can be retrieved by calling the parseErrors() method.

See also parseErrors().

### `[static]` QScxmlStateMachine *QScxmlStateMachine::fromFile(const QString &fileName)

Creates a state machine from the SCXML file specified by fileName.

This method will always return a state machine. If errors occur while reading the SCXML file, the state machine cannot be started. The errors can be retrieved by calling the parseErrors() method.

See also parseErrors().

### `[slot]` bool QScxmlStateMachine::init()

Initializes the state machine.

State machine initialization consists of calling QScxmlDataModel::setup(), setting the initial values for `<data>` elements, and executing any `<script>` tags of the `<scxml>` tag. The initial data values are taken from the `initialValues` property.

Returns `false` if parse errors occur or if any of the initialization steps fail. Returns `true` otherwise.

### `[invokable]` bool QScxmlStateMachine::isActive(const QString &scxmlStateName) const

Returns `true` if the state specified by scxmlStateName is active, `false` otherwise.

Note: This function can be invoked via the meta-object system and from QML. See Q_INVOKABLE.

### `[protected]` bool QScxmlStateMachine::isActive(int stateIndex) const

Returns `true` if the state with the ID stateIndex is active.

This method is part of the interface to the compiled representation of SCXML state machines. It should only be used internally and by state machines compiled from SCXML documents.

### `[invokable]` bool QScxmlStateMachine::isDispatchableTarget(const QString &target) const

Returns `true` if a message to target can be dispatched by this state machine.

Valid targets are:

- `#_parent` for the parent state machine if the current state machine is started by `<invoke>`
- `#_internal` for the current state machine
- `#_scxml_sessionid`, where `sessionid` is the session ID of the current state machine
- `#_servicename`, where `servicename` is the ID or name of a service started with `<invoke>` by this state machine

Note: This function can be invoked via the meta-object system and from QML. See Q_INVOKABLE.

### bool QScxmlStateMachine::isRunning() const

Returns `true` if the state machine is running, `false` otherwise.

Note: Getter function for property running.

See also setRunning() and runningChanged().

### `[signal]` void QScxmlStateMachine::log(const QString &label, const QString &msg)

This signal is emitted if a `<log>` tag is used in the SCXML. label is the value of the label attribute of the `<log>` tag. msg is the value of the evaluated expr attribute of the `<log>` tag. If there is no expr attribute, a null string will be returned.

### `[static]` template <typename Functor> std::function<void (bool)> QScxmlStateMachine::onEntry(Functor functor)

Returns a functor that accepts a boolean argument and calls the given functor if that argument is `true`. The given functor must not accept any arguments.

This is useful to wrap handlers for connectToState() that should only be executed when the state is entered.

### `[static]` std::function<void (bool)> QScxmlStateMachine::onEntry(const QObject *receiver, const char *method)

Returns a functor that accepts a boolean argument and calls the given method on receiver using QMetaObject::invokeMethod() if that argument is `true` and receiver has not been deleted, yet.

The given method must not accept any arguments. method is the plain method name, not enclosed in `SIGNAL()` or `SLOT()`.

This is useful to wrap handlers for connectToState() that should only be executed when the state is entered.

### `[static]` template <typename PointerToMemberFunction> std::function<void (bool)> QScxmlStateMachine::onEntry(const typename QtPrivate::FunctionPointer<PointerToMemberFunction>::Object *receiver, PointerToMemberFunction method)

Returns a functor that accepts a boolean argument and calls the given method on receiver if that argument is `true` and the receiver has not been deleted, yet. The given method must not accept any arguments.

This is useful to wrap handlers for connectToState() that should only be executed when the state is entered.

### `[static]` template <typename Functor> std::function<void (bool)> QScxmlStateMachine::onExit(Functor functor)

Returns a functor that accepts a boolean argument and calls the given functor if that argument is `false`. The given functor must not accept any arguments.

This is useful to wrap handlers for connectToState() that should only be executed when the state is left.

### `[static]` std::function<void (bool)> QScxmlStateMachine::onExit(const QObject *receiver, const char *method)

Returns a functor that accepts a boolean argument and calls the given method on receiver using QMetaObject::invokeMethod() if that argument is `false` and receiver has not been deleted, yet.

The given method must not accept any arguments. method is the plain method name, not enclosed in SIGNAL(...) or SLOT(...).

This is useful to wrap handlers for connectToState() that should only be executed when the state is left.

### `[static]` template <typename PointerToMemberFunction> std::function<void (bool)> QScxmlStateMachine::onExit(const typename QtPrivate::FunctionPointer<PointerToMemberFunction>::Object *receiver, PointerToMemberFunction method)

Returns a functor that accepts a boolean argument and calls the given method on receiver if that argument is `false` and the receiver has not been deleted, yet. The given method must not accept any arguments.

This is useful to wrap handlers for connectToState() that should only be executed when the state is left.

### `[signal]` void QScxmlStateMachine::reachedStableState()

This signal is emitted when the event queue is empty at the end of a macro step or when a final state is reached.

### `[signal]` void QScxmlStateMachine::runningChanged(bool running)

This signal is emitted when the `running` property is changed with running as argument.

Note: Notifier signal for property running.

### void QScxmlStateMachine::setDataModel(QScxmlDataModel *model)

Sets the data model for this state machine to model. There is a 1:1 relation between state machines and models. After setting the model once you cannot change it anymore. Any further attempts to set the model using this method will be ignored.

Note: Setter function for property dataModel.

See also dataModel().

### void QScxmlStateMachine::setRunning(bool running)

Starts the state machine if running is `true`, or stops it otherwise.

Note: Setter function for property running.

See also start(), stop(), isRunning(), and runningChanged().

### `[slot]` void QScxmlStateMachine::start()

Starts this state machine. When a final top-level state is entered, the machine will emit the finished() signal.

Note: A state machine will not run without a running event loop, such as the main application event loop started with QCoreApplication::exec() or QApplication::exec().

Note: Calling start() after stop() will not result in a full reset of its configuration yet, hence it is strongly advised not to do it.

Note: Starting a finished machine yields a warning.

See also runningChanged(), setRunning(), stop(), and finished().

### `[invokable]` QStringList QScxmlStateMachine::stateNames(bool compress = true) const

Retrieves a list of state names of all states.

When compress is `true` (the default), the states that contain child states will be filtered out and only the leaf states will be returned. When it is `false`, the full list of all states will be returned.

The returned list does not contain the states of possible nested state machines.

Note: The order of the state names in the list is the order in which the states occurred in the SCXML document.

Note: This function can be invoked via the meta-object system and from QML. See Q_INVOKABLE.

### `[slot]` void QScxmlStateMachine::stop()

Stops this state machine. The machine will not execute any further state transitions. Its `running` property is set to `false`.

See also runningChanged(), start(), and setRunning().

### `[invokable]` void QScxmlStateMachine::submitEvent(QScxmlEvent *event)

Submits the SCXML event event to the internal or external event queue depending on the priority of the event.

When a delay is set, the event will be queued for delivery after the timeout has passed. The state machine takes ownership of event and deletes it after processing.

Note: This function can be invoked via the meta-object system and from QML. See Q_INVOKABLE.

### `[invokable]` void QScxmlStateMachine::submitEvent(const QString &eventName)

A utility method to create and submit an external event with the specified eventName as the name.

Note: This function can be invoked via the meta-object system and from QML. See Q_INVOKABLE.

### `[invokable]` void QScxmlStateMachine::submitEvent(const QString &eventName, const QVariant &data)

A utility method to create and submit an external event with the specified eventName as the name and data as the payload data.

Note: This function can be invoked via the meta-object system and from QML. See Q_INVOKABLE.