SCXML-Medienspieler
Sendet Daten an ein C++-Datenmodell und empfängt sie von diesem.
Media Player demonstriert den Zugriff auf Daten aus einem C++-Datenmodell. Das Datenmodell ermöglicht das Schreiben von C++-Code für expr-Attribute und <script>
-Elemente. Der Datenteil des Datenmodells wird durch eine Unterklasse von QScxmlCppDataModel unterstützt, für die der Qt SCXML Compiler (qscxmlc
) die Dispatch-Methoden erzeugt.
Die Benutzeroberfläche wird mit Qt Quick erstellt.
Ausführen des Beispiels
Zum Ausführen des Beispiels von Qt Creatorauszuführen, öffnen Sie den Modus Welcome und wählen Sie das Beispiel aus Examples aus. Weitere Informationen finden Sie unter Erstellen und Ausführen eines Beispiels.
Verwenden des C++-Datenmodells
Wir geben das Datenmodell als Wert des Attributs datamodel des Elements <scxml>
in der SCXML-Datei an:
<scxml xmlns="http://www.w3.org/2005/07/scxml" version="1.0" name="MediaPlayerStateMachine" initial="stopped" datamodel="cplusplus:TheDataModel:thedatamodel.h"
Das Format des Datenmodell-Attributs ist: cplusplus:<class-name>:<classdef-header>
. Daher benötigen wir eine Datei namens thedatamodel.h, die eine Unterklasse von QScxmlCppDataModel enthält:
#include "qscxmlcppdatamodel.h" #include <QtQml/qqml.h> class TheDataModel: public QScxmlCppDataModel { Q_OBJECT Q_SCXML_DATAMODEL
QScxmlCppDataModel leitet sich von QObject ab, also fügen wir das Makro Q_OBJECT
in den privaten Abschnitt der Definition ein, direkt nach der öffnenden Klammer. Dann fügen wir das Makro Q_SCXML_DATAMODEL
nach Q_OBJECT
ein. Das Makro erweitert sich zur Deklaration virtueller Methoden, deren Implementierung vom Compiler Qt SCXML generiert wird.
In der SCXML-Datei geben wir C++-Anweisungen im Element <script>
an und verwenden das Attribut expr für den Zugriff auf das Datenmodell:
<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>
Der Qt SCXML Compiler generiert die verschiedenen evaluateTo
Methoden und wandelt die Ausdrücke und Skripte in Lambdas innerhalb dieser Methoden in mediaplayer.cpp um:
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(); }(); .... }
© 2025 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.