Reproductor multimedia SCXML
Envía datos a un modelo de datos C++ y los recibe de él.

Media Player demuestra cómo acceder a datos desde un modelo de datos C++. El modelo de datos permite escribir código C++ para atributos expr y elementos <script>. La parte de datos del modelo de datos está respaldada por una subclase de QScxmlCppDataModel, para la que el compilador Qt SCXML (qscxmlc) genera los métodos de envío.
La interfaz de usuario se crea utilizando Qt Quick.
Ejecución del ejemplo
Para ejecutar el ejemplo desde Qt Creatorabra el modo Welcome y seleccione el ejemplo de Examples. Para más información, ver Qt Creator: Tutorial: Construir y ejecutar.
Utilización del modelo de datos C
Especificamos el modelo de datos como valor del atributo datamodel del elemento <scxml> en el archivo SCXML:
<scxml
xmlns="http://www.w3.org/2005/07/scxml"
version="1.0"
name="MediaPlayerStateMachine"
initial="stopped"
datamodel="cplusplus:TheDataModel:thedatamodel.h"El formato del atributo datamodel es: cplusplus:<class-name>:<classdef-header>. Por lo tanto, necesitamos un archivo llamado thedatamodel.h que contenga una subclase de QScxmlCppDataModel:
#include "qscxmlcppdatamodel.h" #include <QtQml/qqml.h> class TheDataModel: public QScxmlCppDataModel { Q_OBJECT Q_SCXML_DATAMODEL
QScxmlCppDataModel deriva de QObject, por lo que añadimos la macro Q_OBJECT en la sección privada de la definición, justo después del corchete de apertura. A continuación, colocamos la macro Q_SCXML_DATAMODEL después de Q_OBJECT. La macro se expande a la declaración de métodos virtuales, cuya implementación genera el compilador Qt SCXML.
En el archivo SCXML, especificamos las declaraciones C++ en el elemento <script> y utilizamos el atributo expr para acceder al modelo de datos:
<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>El compilador Qt SCXML genera los distintos métodos evaluateTo y convierte las expresiones y scripts en lambdas dentro de esos métodos en 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.