Sur cette page

QScxmlCppDataModel Class

La classe QScxmlCppDataModel est un modèle de données C++ destiné à une machine à états « Qt SCXML ». En savoir plus...

En-tête : #include <QScxmlCppDataModel>
CMake : find_package(Qt6 REQUIRED COMPONENTS Scxml)
target_link_libraries(mytarget PRIVATE Qt6::Scxml)
qmake : QT += scxml
Hérite de : QScxmlDataModel

Fonctions publiques

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

Fonctions publiques réimplémentées

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

Description détaillée

Le modèle de données C++ pour SCXML vous permet d'écrire du code C++ pour les attributs expr et les éléments <script>. La partie « données » du modèle de données s'appuie sur une sous-classe de QScxmlCppDataModel, pour laquelle le compilateur Qt SCXML (qscxmlc) générera les méthodes de répartition. Elle ne peut pas être utilisée lors du chargement d'un fichier SCXML à l'exécution.

Son utilisation s'effectue via l'attribut ` datamodel ` de l'élément ` <scxml> ` :

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

Le format de l’attribut « datamodel » est : cplusplus:<class-name>:<classdef-header>. Ainsi, pour l’exemple ci-dessus, il doit exister un fichier « thedatamodel.h » contenant une sous-classe de « QScxmlCppDataModel », comprenant au moins les éléments suivants :

#include <QScxmlCppDataModel>

class TheDataModel: public QScxmlCppDataModel
{
    Q_OBJECT
    Q_SCXML_DATAMODEL
    ...
};

Q_SCXML_DATAMODEL doit apparaître dans la section privée de la définition de classe, par exemple juste après la parenthèse ouvrante, ou après une macro Q_OBJECT. Cette macro se développe en une déclaration de méthodes virtuelles dont l’implémentation est générée par le compilateur Qt SCXML.

Le compilateur Qt SCXML générera les différentes méthodes evaluateTo et convertira les expressions et les scripts en lambda au sein de ces méthodes. Par exemple :

<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>

Cela donnera :

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(); }();
    // ....
}

Vous n’êtes donc pas limité à l’appel de fonctions. Dans un élément ` <script> `, vous pouvez placer zéro ou plusieurs instructions C++, et dans les attributs `cond` ou `expr`, vous pouvez utiliser n’importe quelle expression C++ pouvant être convertie respectivement en `bool` ou en ` QVariant`. De plus, comme le pointeur ` this ` est également capturé, vous pouvez appeler ou accéder au modèle de données (l’attribut `media ` dans l’exemple ci-dessus). Pour l’exemple complet, consultez SCXML Media Player.

Voir également QScxmlStateMachine et QScxmlDataModel.

Documentation sur les fonctions membres

[explicit] QScxmlCppDataModel::QScxmlCppDataModel(QObject *parent = nullptr)

Crée un nouveau modèle de données C++ dont l'objet parent est parent.

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

Réimplémente : QScxmlDataModel::evaluateAssignment(QScxmlExecutableContent::EvaluatorId id, bool *ok).

Cette méthode n'effectue aucune action, ignore ` id` et définit ` ok ` sur ` false`. Redéfinissez-la dans votre modèle de données spécifique afin d'implémenter ` <assign>`.

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

Réimplémente : QScxmlDataModel::evaluateForeach(QScxmlExecutableContent::EvaluatorId id, bool *ok, QScxmlDataModel::ForeachLoopBody *body).

Cette méthode n'effectue aucune action, ignore les paramètres ` id ` et ` body`, et définit ` ok ` sur ` false`. Redéfinissez-la dans votre modèle de données spécifique afin d'implémenter ` <foreach>`.

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

Réimplémente : QScxmlDataModel::evaluateInitialization(QScxmlExecutableContent::EvaluatorId id, bool *ok).

Cette méthode n'effectue aucune action, ignore ` id` et définit ` ok ` sur ` false`. Redéfinissez-la dans votre modèle de données spécifique afin d'implémenter ` <data>`.

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

Réimplémente : QScxmlDataModel::hasScxmlProperty(const QString &name) const.

Cette méthode renvoie toujours ` false ` et ignore ` name`. Redéfinissez-la pour implémenter la recherche des propriétés du modèle de données via l’attribut ` location ` de divers éléments.

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

Renvoie « true » si la machine à états se trouve dans l'état spécifié par stateName; sinon, renvoie « false ».

const QScxmlEvent &QScxmlCppDataModel::scxmlEvent() const

Contient l'événement en cours traité par la machine à états.

Voir également la spécification SCXML - 5.10 Variables système pour la description de la variable ` _event `.

Renvoie l'événement en cours de traitement.

Voir également setScxmlEvent().

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

Réimplémente : QScxmlDataModel::scxmlProperty(const QString &name) const.

Cette méthode renvoie toujours un ` QVariant ` vide et ignore ` name`. Redéfinissez-la pour implémenter la recherche des propriétés du modèle de données via l'attribut ` location ` de divers éléments.

Voir également setScxmlProperty().

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

Réimplémente : QScxmlDataModel::setScxmlEvent(const QScxmlEvent &event).

Définit l'event qui sera traité ensuite.

Voir aussi QScxmlCppDataModel::scxmlEvent.

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

Réimplémente : QScxmlDataModel::setScxmlProperty(const QString &name, const QVariant &value, const QString &context).

Cette méthode renvoie toujours ` false ` et ignore ` name`, ` value` et ` context`. Redéfinissez-la pour implémenter la recherche des propriétés du modèle de données via l'attribut ` location ` de divers éléments.

Voir également ` scxmlProperty()`.

[override virtual invokable] bool QScxmlCppDataModel::setup(const QVariantMap &initialDataValues)

Réimplémente : QScxmlDataModel::setup(const QVariantMap &initialDataValues).

Appelée lors de l’initialisation de la machine à états pour configurer celle-ci à l’aide des valeurs initiales des variables du modèle de données spécifiées par leurs clés, initialDataValues. Il s’agit des valeurs spécifiées par les balises <param> dans un élément <invoke>.

Renvoie true en cas de succès.

Remarque : cette fonction peut être appelée via le système de méta-objets et depuis QML. Voir Q_INVOKABLE.

Voir également QScxmlStateMachine::init.

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.