Auf dieser Seite

SCXML Media Player

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

Mediaplayer mit Titelliste auf der linken Seite und dem Status „Angehalten“ auf der rechten Seite

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:

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_DATAMODEL

QScxmlCppDataModel 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(&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>

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(); }();
....
}

Beispielprojekt @ 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.