QScxmlCppDataModel Class | Qt SCXML 5.9

Qt 5.9 | Qt SCXML | C++ Classes | QScxmlCppDataModel

Qt 5.9.4 Reference Documentation

# QScxmlCppDataModel Class

The QScxmlCppDataModel class is a C++ data model for a Qt SCXML state machine. More...

Header: | #include <QScxmlCppDataModel>
qmake: | QT += scxml
Since: | Qt 5.7
Inherits: | QScxmlDataModel

- List of all members, including inherited members

## Public Functions

| QScxmlCppDataModel(QObject *parent = nullptr)
bool | inState(const QString &stateName) const
const QScxmlEvent & | scxmlEvent() const

## Reimplemented Public Functions

virtual void | evaluateAssignment(QScxmlExecutableContent::EvaluatorId id, bool *ok)
virtual void | evaluateForeach(QScxmlExecutableContent::EvaluatorId id, bool *ok, ForeachLoopBody *body)
virtual void | evaluateInitialization(QScxmlExecutableContent::EvaluatorId id, bool *ok)
virtual bool | hasScxmlProperty(const QString &name) const
virtual QVariant | scxmlProperty(const QString &name) const
virtual void | setScxmlEvent(const QScxmlEvent &event)
virtual bool | setScxmlProperty(const QString &name, const QVariant &value, const QString &context)
virtual bool | setup(const QVariantMap &initialDataValues)

- 14 public functions inherited from QScxmlDataModel

### Additional Inherited Members

- 1 property inherited from QScxmlDataModel
- 1 signal inherited from QScxmlDataModel

## Detailed Description

The QScxmlCppDataModel class is a C++ data model for a Qt SCXML state machine.

The C++ data model for SCXML lets you write C++ code for expr attributes and `<script>` elements. The data part of the data model is backed by a subclass of QScxmlCppDataModel, for which the Qt SCXML compiler (`qscxmlc`) will generate the dispatch methods. It cannot be used when loading an SCXML file at runtime.

Usage is through the datamodel attribute of the `<scxml>` element:

      <scxml datamodel="cplusplus:TheDataModel:thedatamodel.h"  ....>

The format of the datamodel attribute is: `cplusplus:<class-name>:<classdef-header>`. So, for the example above, there should be a file thedatamodel.h containing a subclass of QScxmlCppDataModel, containing at least the following:

      #include "qscxmlcppdatamodel.h"

      class TheDataModel: public QScxmlCppDataModel
      {
          Q_OBJECT
          Q_SCXML_DATAMODEL
      };

The Q_SCXML_DATAMODEL has to appear in the private section of the class definition, for example right after the opening bracket, or after a Q_OBJECT macro. This macro expands to the declaration of some virtual methods whose implementation is generated by the Qt SCXML compiler.

The Qt SCXML compiler will generate the various `evaluateTo` methods, and convert expressions and scripts into lambdas inside those methods. For example:

      <scxml datamodel="cplusplus:TheDataModel:thedatamodel.h" xmlns="http://www.w3.org/2005/07/scxml" version="1.0" name="MediaPlayerStateMachine">
          <state id="stopped">
              <transition event="tap" cond="isValidMedia()" target="playing"/>
          </state>

          <state id="playing">
              <onentry>
                  <script>
                      media = eventData().value(QStringLiteral(&quot;media&quot;)).toString();
                  </script>
                  <send event="playbackStarted">
                      <param name="media" expr="media"/>
                  </send>
              </onentry>
          </state>
      </scxml>

This will result in:

      bool TheDataModel::evaluateToBool(QScxmlExecutableContent::EvaluatorId id, bool *ok) {
          // ....
              return [this]()->bool{ return isValidMedia(); }();
          // ....
      }

      QVariant TheDataModel::evaluateToVariant(QScxmlExecutableContent::EvaluatorId id, bool *ok) {
          // ....
              return [this]()->QVariant{ return media; }();
          // ....
      }

      void TheDataModel::evaluateToVoid(QScxmlExecutableContent::EvaluatorId id, bool *ok) {
          // ....
              [this]()->void{ media = eventData().value(QStringLiteral("media")).toString(); }();
          // ....
      }

So, you are not limited to call functions. In a `<script>` element you can put zero or more C++ statements, and in cond or expr attributes you can use any C++ expression that can be converted to the respective bool or QVariant. And, as the `this` pointer is also captured, you can call or access the data model (the media attribute in the example above). For the full example, see Qt SCXML: Media Player QML Example (C++ Data Model).

See also QScxmlStateMachine and QScxmlDataModel.

## Member Function Documentation

### QScxmlCppDataModel::QScxmlCppDataModel(QObject *parent = nullptr)

Creates a new C++ data model with the parent object parent.

### `[virtual]` void QScxmlCppDataModel::evaluateAssignment(QScxmlExecutableContent::EvaluatorId id, bool *ok)

Reimplemented from QScxmlDataModel::evaluateAssignment().

This method does not perform any action, ignores id, and sets ok to `false`. Override it in your specific data model in order to implement `<assign>`.

### `[virtual]` void QScxmlCppDataModel::evaluateForeach(QScxmlExecutableContent::EvaluatorId id, bool *ok, ForeachLoopBody *body)

Reimplemented from QScxmlDataModel::evaluateForeach().

This method does not perform any action, ignores id and body, and sets ok to `false`. Override it in your specific data model in order to implement `<foreach>`.

### `[virtual]` void QScxmlCppDataModel::evaluateInitialization(QScxmlExecutableContent::EvaluatorId id, bool *ok)

Reimplemented from QScxmlDataModel::evaluateInitialization().

This method does not perform any action, ignores id, and sets ok to `false`. Override it in your specific data model in order to implement `<data>`.

### `[virtual]` bool QScxmlCppDataModel::hasScxmlProperty(const QString &name) const

Reimplemented from QScxmlDataModel::hasScxmlProperty().

This method always returns `false` and ignores name. Override it to implement the lookup of data model properties via the `location` attribute of various elements.

### bool QScxmlCppDataModel::inState(const QString &stateName) const

Returns `true` if the state machine is in the state specified by stateName, `false` otherwise.

### const QScxmlEvent &QScxmlCppDataModel::scxmlEvent() const

Holds the current event that is being processed by the state machine.

See also SCXML Specification - 5.10 System Variables for the description of the `_event` variable.

Returns the event currently being processed.

See also setScxmlEvent().

### `[virtual]` QVariant QScxmlCppDataModel::scxmlProperty(const QString &name) const

Reimplemented from QScxmlDataModel::scxmlProperty().

This method always returns an empty QVariant and ignores name. Override it to implement the lookup of data model properties via the `location` attribute of various elements.

See also setScxmlProperty().

### `[virtual]` void QScxmlCppDataModel::setScxmlEvent(const QScxmlEvent &event)

Reimplemented from QScxmlDataModel::setScxmlEvent().

Sets the event that will be processed next.

See also QScxmlCppDataModel::scxmlEvent.

### `[virtual]` bool QScxmlCppDataModel::setScxmlProperty(const QString &name, const QVariant &value, const QString &context)

Reimplemented from QScxmlDataModel::setScxmlProperty().

This method always returns `false` and ignores name, value, and context. Override it to implement the lookup of data model properties via the `location` attribute of various elements.

See also scxmlProperty().

### `[virtual]` bool QScxmlCppDataModel::setup(const QVariantMap &initialDataValues)

Reimplemented from QScxmlDataModel::setup().

Called during state machine initialization to set up a state machine using the initial values for data model variables specified by their keys, initialDataValues. These are the values specified by `<param>` tags in an `<invoke>` element.

See also QScxmlStateMachine::init.