SCXML メディアプレーヤー
C++データモデルとの間でデータの送受信を行います。

Media Playerは、C++データモデルからデータにアクセスする方法を示しています。このデータモデルにより、expr属性や<script> 要素に対するC++コードを記述することが可能になります。データモデルのデータ部分は QScxmlCppDataModel のサブクラスによって支えられており、Qt SCXML コンパイラ(qscxmlc )がこのサブクラス用のディスパッチメソッドを生成します。
UIはQt Quick を使用して作成されます。
例の動作確認
以下の手順でサンプルを実行できます:
- Qt Creator
Welcome モードを開き、Examples からこのサンプルを選択します。詳細については、『Qt Creator :チュートリアル:ビルドと実行』を参照してください。
- Qt Extension for Visual Studio Code
Command Palette から `Qt: Open Qt examples ` コマンドを実行し、リストからサンプルを選択します。詳細については、Qt Extension for Visual Studio Code: チュートリアル: ビルドと実行を参照してください。
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_DATAMODELQScxmlCppDataModel QObject から派生しているため、定義の private セクションで、開き括弧の直後に マクロを追加します。次に、 の後に マクロを配置します。このマクロは仮想メソッドの宣言に展開され、その実装は コンパイラによって生成されます。Q_OBJECT 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(); }();
....
}© 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.