Lecteur multimédia SCXML
Envoie et reçoit des données d'un modèle de données C++.

Lelecteur multimédia montre comment accéder à des données à partir d'un modèle de données C++. Le modèle de données 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.
L'interface utilisateur est créée à l'aide de Qt Quick.
Exécution de l'exemple
Pour exécuter l'exemple à partir de Qt Creatorouvrez le mode Welcome et sélectionnez l'exemple à partir de Examples. Pour plus d'informations, voir Qt Creator: Tutorial : Construire et exécuter.
Utilisation du modèle de données C
Nous spécifions le modèle de données en tant que valeur de l'attribut datamodel de l'élément <scxml> dans le fichier SCXML :
<scxml
xmlns="http://www.w3.org/2005/07/scxml"
version="1.0"
name="MediaPlayerStateMachine"
initial="stopped"
datamodel="cplusplus:TheDataModel:thedatamodel.h"Le format de l'attribut datamodel est : cplusplus:<class-name>:<classdef-header>. Par conséquent, nous avons besoin d'un fichier appelé thedatamodel.h qui contient une sous-classe de QScxmlCppDataModel:
#include "qscxmlcppdatamodel.h" #include <QtQml/qqml.h> class TheDataModel: public QScxmlCppDataModel { Q_OBJECT Q_SCXML_DATAMODEL
QScxmlCppDataModel dérive de QObject, nous ajoutons donc la macro Q_OBJECT dans la section privée de la définition, juste après le crochet d'ouverture. Nous plaçons ensuite la macro Q_SCXML_DATAMODEL après Q_OBJECT. La macro s'étend à la déclaration des méthodes virtuelles, dont l'implémentation est générée par le compilateur Qt SCXML.
Dans le fichier SCXML, nous spécifions des instructions C++ dans l'élément <script> et utilisons l'attribut expr pour accéder au modèle de données :
<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>
<onexit>
<send event="playbackStopped">
<param name="media" expr="media"/>
</send>
</onexit>
<transition event="tap" cond="!isValidMedia() || media == eventData().value(QStringLiteral("media"))" target="stopped"/>
<transition event="tap" cond="isValidMedia() && media != eventData().value(QStringLiteral("media"))" target="playing"/>
</state>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 dans mediaplayer.cpp:
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(); }(); .... }
© 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.