SCXMLメディアプレーヤー
C++データモデルとのデータの送受信
Media Playerは、C++データモデルからデータにアクセスする方法を示します。このデータ・モデルは、expr属性と<script>
要素のためのC++コードを書くことを可能にします。データモデルのデータ部分は、QScxmlCppDataModel のサブクラスによってサポートされており、Qt SCXML コンパイラ (qscxmlc
) がディスパッチメソッドを生成します。
UI は Qt Quick を使って作成されています。
例の実行
Qt Creator からサンプルを実行するには、Welcome モードを開き、Examples からサンプルを選択します。詳細については、Building and Running an Example を参照してください。
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 というファイルが必要です。次に、 の後に マクロを配置します。このマクロは仮想メソッドの宣言に展開され、その実装は Qt SCXML コンパイラによって生成されます。Q_OBJECT
Q_SCXML_DATAMODEL
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(); }(); .... }
©2024 The Qt Company Ltd. 本書に含まれるドキュメントの著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。