SCXML Media Player
Sendet Daten an ein C++-Datenmodell und empfängt Daten von diesem.

Der Media Player veranschaulicht, wie auf Daten aus einem C++-Datenmodell zugegriffen werden kann. Das Datenmodell ermöglicht das Schreiben von C++-Code für „expr“-Attribute und „ <script> “-Elemente. Der Datenteil des Datenmodells basiert auf einer Unterklasse von „ QScxmlCppDataModel “, für die der „ Qt SCXML “-Compiler (qscxmlc) die Dispatch-Methoden generiert.
Die Benutzeroberfläche wird mit „ Qt Quick “ erstellt.
Ausführen des Beispiels
Sie können das Beispiel wie folgt ausführen:
- Qt Creator
Öffnen Sie den Modus „ Welcome “ und wählen Sie das Beispiel unter Examples aus. Weitere Informationen finden Sie unter Qt Creator: Tutorial: Erstellen und Ausführen.
- Qt Extension for Visual Studio Code
Führen Sie den Befehl „ Qt: Open Qt examples “ über „ Command Palette “ aus und wählen Sie das Beispiel aus der Liste aus. Weitere Informationen finden Sie unter Qt Extension for Visual Studio Code: Tutorial: Erstellen und Ausführen.
Verwendung des C++-Datenmodells
Wir legen das Datenmodell als Wert des Attributs „datamodel“ des Elements „ <scxml> “ in der SCXML-Datei fest:
<scxml
xmlns="http://www.w3.org/2005/07/scxml"
version="1.0"
name="MediaPlayerStateMachine"
initial="stopped"
datamodel="cplusplus:TheDataModel:thedatamodel.h"Das Format des Attributs „datamodel“ lautet: „ 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_DATAMODELQScxmlCppDataModel Da diese von ` QObject` abgeleitet ist, fügen wir das Makro ` Q_OBJECT ` im privaten Abschnitt der Definition direkt nach der öffnenden Klammer ein. Anschließend platzieren wir das Makro ` Q_SCXML_DATAMODEL ` nach ` Q_OBJECT`. Das Makro wird zur Deklaration virtueller Methoden erweitert, deren Implementierung vom ` Qt SCXML `-Compiler generiert wird.
In der SCXML-Datei geben wir C++-Anweisungen im Element ` <script> ` an und nutzen das Attribut `expr`, um auf das Datenmodell zuzugreifen:
<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 Methoden „ evaluateTo “ und wandelt die Ausdrücke und Skripte in Lambda-Ausdrücke 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(); }();
....
}© 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.