Sur cette page

QScxmlCppDataModel Class

La classe QScxmlCppDataModel est un modèle de données C++ pour une machine à états Qt SCXML. Plus...

En-tête : #include <QScxmlCppDataModel>
CMake : find_package(Qt6 REQUIRED COMPONENTS Scxml)
target_link_libraries(mytarget PRIVATE Qt6::Scxml)
qmake : QT += scxml
Héritages : 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 est soutenue par une sous-classe de QScxmlCppDataModel, pour laquelle le compilateur Qt SCXML (qscxmlc) génère les méthodes de distribution. Il ne peut pas être utilisé lors du chargement d'un fichier SCXML au moment de l'exécution.

L'utilisation se fait par l'intermédiaire de 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 devrait y avoir un fichier thedatamodel.h contenant une sous-classe de QScxmlCppDataModel, contenant au moins les éléments suivants :

#include <QScxmlCppDataModel>

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

Le Q_SCXML_DATAMODEL doit apparaître dans la section privée de la définition de la classe, par exemple juste après le crochet d'ouverture, ou après une macro Q_OBJECT. Cette macro s'étend à la déclaration de certaines méthodes virtuelles dont l'implémentation est générée par le compilateur Qt SCXML.

Le compilateur Qt SCXML génère les différentes méthodes evaluateTo et convertit les expressions et les scripts en lambdas à l'intérieur 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>

Il en résultera :

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é aux fonctions d'appel. Dans un élément <script>, vous pouvez placer zéro ou plusieurs déclarations C++, et dans les attributs cond ou expr, vous pouvez utiliser n'importe quelle expression C++ qui peut être convertie en bool ou QVariant. Et, 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 un exemple complet, voir 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++ avec l'objet parent 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 remplace ok par false. Surchargez-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 id et body, et définit ok à false. Surchargez-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 remplace ok par false. Surchargez-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. Surchargez-la pour mettre en œuvre la consultation 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 est dans l'état spécifié par stateName, false sinon.

const QScxmlEvent &QScxmlCppDataModel::scxmlEvent() const

Contient l'événement en cours de traitement par la machine d'état.

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 aussi setScxmlEvent().

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

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

Cette méthode renvoie toujours une adresse QVariant vide et ignore name. Surchargez-la pour mettre en œuvre la consultation 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 le site 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. Surchargez-la pour mettre en œuvre la consultation des propriétés du modèle de données via l'attribut location de divers éléments.

Voir aussi scxmlProperty().

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

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

Appelé lors de l'initialisation de la machine à états pour configurer une machine à états en utilisant les 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>.

Retourne true en cas de succès.

Note : Cette fonction peut être invoquée via le système de méta-objets et à partir de QML. Voir Q_INVOKABLE.

Voir aussi 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.