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

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

サンプルプロジェクト @ code.qt.io

©2024 The Qt Company Ltd. 本書に含まれるドキュメントの著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。