SCXMLメディアプレーヤー
C++データモデルとのデータの送受信
Media Playerは、C++データモデルからデータにアクセスする方法を示します。このデータ・モデルは、expr属性と<script>
要素のためのC++コードを書くことを可能にします。データ・モデルのデータ部分は、QScxmlCppDataModel のサブクラスによってバックアップされ、Qt SCXML コンパイラ (qscxmlc
) がディスパッチ・メソッドを生成します。
UIはQt Quick を使って作成されます。
例の実行
からサンプルを実行するには Qt Creatorからサンプルを実行するには、Welcome モードを開き、Examples からサンプルを選択します。詳細については、例の構築と実行を参照してください。
C++データ・モデルの使用
SCXML ファイルの<scxml>
要素のdatamodel属性の値としてデータモデルを指定します:
<scxml xmlns="http://www.w3.org/2005/07/scxml" version="1.0" name="MediaPlayerStateMachine" initial="stopped" datamodel="cplusplus:TheDataModel:thedatamodel.h"
datamodel属性のフォーマットはcplusplus:<class-name>:<classdef-header>
です。したがって、QScxmlCppDataModel のサブクラスを含むthedatamodel.hというファイルが必要です:
#include "qscxmlcppdatamodel.h" #include <QtQml/qqml.h> class TheDataModel: public QScxmlCppDataModel { Q_OBJECT Q_SCXML_DATAMODEL
QScxmlCppDataModel QObject Q_OBJECT
のサブクラスを含むdatamodel.h というファイルが必要です。次に、 の後に マクロを配置します。このマクロは仮想メソッドの宣言に展開され、その実装は コンパイラによって生成されます。Q_OBJECT
Q_SCXML_DATAMODEL
Qt SCXML
SCXML ファイルでは、<script>
要素で C++ ステートメントを指定し、expr属性を使用してデータモデルにアクセスします:
<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>
Qt SCXML コンパイラは様々なevaluateTo
メソッドを生成し、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(); }(); .... }
© 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.