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("media")).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.