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

Media Player montre comment accéder aux données d’un modèle de données C++. Ce 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 s’appuie sur une sous-classe de QScxmlCppDataModel, pour laquelle le compilateur Qt SCXML (qscxmlc) génère les méthodes de répartition.
L’interface utilisateur est créée à l’aide de Qt Quick.
Exécution de l'exemple
Vous pouvez exécuter l’exemple à partir de :
- Qt Creator
Ouvrez le mode Welcome et sélectionnez l’exemple à l’adresse Examples. Pour plus d’informations, consultez Qt Creator: Tutoriel : Compiler et exécuter.
- Qt Extension for Visual Studio Code
Exécutez la commande « Qt: Open Qt examples » à partir de Command Palette, puis sélectionnez l’exemple dans la liste. Pour plus d’informations, consultez Qt Extension for Visual Studio Code: Tutoriel : Compiler 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 nommé `thedatamodel.h ` contenant une sous-classe de ` QScxmlCppDataModel` :
#include "qscxmlcppdatamodel.h"
#include <QtQml/qqml.h>
class TheDataModel: public QScxmlCppDataModel
{
Q_OBJECT
Q_SCXML_DATAMODELQScxmlCppDataModel dérive de ` QObject`, nous ajoutons donc la macro ` Q_OBJECT ` dans la section privée de la définition, juste après la parenthèse ouvrante. Nous plaçons ensuite la macro ` Q_SCXML_DATAMODEL ` après ` Q_OBJECT`. La 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.
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 d’ evaluateTo s 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.