Sur cette page

Lecteur multimédia SCXML

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

Lecteur multimédia avec la liste des morceaux à gauche et l'état « Arrêté » à droite

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 :

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_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 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(&quot;media&quot;)).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(&quot;media&quot;))" target="stopped"/>
        <transition event="tap" cond="isValidMedia() &amp;&amp; media != eventData().value(QStringLiteral(&quot;media&quot;))" 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(); }();
....
}

Exemple de projet sur code.qt.io

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