このページでは

QScxmlCppDataModel Class

QScxmlCppDataModel クラスは、Qt SCXML のステートマシン用のC++データモデルです。詳細...

ヘッダー: #include <QScxmlCppDataModel>
CMake: find_package(Qt6 REQUIRED COMPONENTS Scxml)
target_link_libraries(mytarget PRIVATE Qt6::Scxml)
qmake: QT += scxml
継承元: QScxmlDataModel

パブリック関数

QScxmlCppDataModel(QObject *parent = nullptr)
bool inState(const QString &stateName) const
const QScxmlEvent &scxmlEvent() const

再実装されたパブリック関数

virtual void evaluateAssignment(QScxmlExecutableContent::EvaluatorId id, bool *ok) override
virtual void evaluateForeach(QScxmlExecutableContent::EvaluatorId id, bool *ok, QScxmlDataModel::ForeachLoopBody *body) override
virtual void evaluateInitialization(QScxmlExecutableContent::EvaluatorId id, bool *ok) override
virtual bool hasScxmlProperty(const QString &name) const override
virtual QVariant scxmlProperty(const QString &name) const override
virtual void setScxmlEvent(const QScxmlEvent &event) override
virtual bool setScxmlProperty(const QString &name, const QVariant &value, const QString &context) override
virtual bool setup(const QVariantMap &initialDataValues) override

詳細な説明

SCXML用のC++データモデルを使用すると、expr属性および<script> 要素に対するC++コードを記述できます。このデータモデルのデータ部分は、QScxmlCppDataModelのサブクラスによって支えられており、Qt SCXML コンパイラ(qscxmlc )がこのサブクラスに対してディスパッチメソッドを生成します。実行時にSCXMLファイルをロードする際には使用できません。

使用方法は、<scxml> 要素のdatamodel属性を通じて行います:

<scxml datamodel="cplusplus:TheDataModel:thedatamodel.h"  ....>

datamodel属性の形式は次のとおりです:cplusplus:<class-name>:<classdef-header> 。したがって、上記の例の場合、QScxmlCppDataModelのサブクラスを含むthedatamodel.hというファイルが必要であり、その中には少なくとも以下の記述が含まれている必要があります:

#include <QScxmlCppDataModel>

class TheDataModel: public QScxmlCppDataModel
{
    Q_OBJECT
    Q_SCXML_DATAMODEL
    ...
};

Q_SCXML_DATAMODELは、クラス定義のprivateセクション、例えば開き括弧の直後、またはQ_OBJECT マクロの後に記述する必要があります。このマクロは、Qt SCXML コンパイラによって実装が生成されるいくつかの仮想メソッドの宣言に展開されます。

Qt SCXML コンパイラは、さまざまなevaluateTo メソッドを生成し、式やスクリプトをそれらのメソッド内のラムダ式に変換します。例えば:

<scxml datamodel="cplusplus:TheDataModel:thedatamodel.h" xmlns="http://www.w3.org/2005/07/scxml" version="1.0" name="MediaPlayerStateMachine">
    <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>
    </state>
</scxml>

これにより、次のような結果になります:

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

したがって、関数の呼び出しに限定されることはありません。<script> 要素内には0個以上のC++文を記述でき、cond属性や expr属性では、それぞれbool型またはQVariant 型に変換可能な任意のC++式を使用できます。 また、this ポインタもキャプチャされるため、データモデル(上記の例ではmedia属性)を呼び出したり、アクセスしたりすることができます。完全な例については、SCXML Media Playerを参照してください。

「 QScxmlStateMachine 」および「QScxmlDataModel 」も参照してください 。

メンバ関数のドキュメント

[explicit] QScxmlCppDataModel::QScxmlCppDataModel(QObject *parent = nullptr)

親オブジェクトparent を使用して、新しい C++ データモデルを作成します。

[override virtual] void QScxmlCppDataModel::evaluateAssignment(QScxmlExecutableContent::EvaluatorId id, bool *ok)

QScxmlDataModel::evaluateAssignment(QScxmlExecutableContent::EvaluatorId id, bool *ok) を再実装します。

このメソッドは何も処理を行わず、id を無視し、ok をfalse に設定します。<assign> を実装するには、特定のデータモデルでこのメソッドをオーバーライドしてください。

[override virtual] void QScxmlCppDataModel::evaluateForeach(QScxmlExecutableContent::EvaluatorId id, bool *ok, QScxmlDataModel::ForeachLoopBody *body)

QScxmlDataModel::evaluateForeach(QScxmlExecutableContent::EvaluatorId id, bool *ok, QScxmlDataModel::ForeachLoopBody *body) を再実装します。

このメソッドは何も処理を行わず、id およびbody を無視し、ok をfalse に設定します。<foreach> を実装するには、特定のデータモデルでこのメソッドをオーバーライドしてください。

[override virtual] void QScxmlCppDataModel::evaluateInitialization(QScxmlExecutableContent::EvaluatorId id, bool *ok)

QScxmlDataModel::evaluateInitialization(QScxmlExecutableContent::EvaluatorId id, bool *ok) を再実装します。

このメソッドは何も処理を行わず、id を無視し、ok をfalse に設定します。<data> を実装するために、特定のデータモデルでこのメソッドをオーバーライドしてください。

[override virtual] bool QScxmlCppDataModel::hasScxmlProperty(const QString &name) const

QScxmlDataModel::hasScxmlProperty(const QString &name) const を再実装します。

このメソッドは常にfalse を返し、name を無視します。各種要素のlocation 属性を通じてデータモデルのプロパティを検索する機能を実装するには、このメソッドをオーバーライドしてください。

bool QScxmlCppDataModel::inState(const QString &stateName) const

ステートマシンが `stateName` で指定された状態にある場合は `true ` を返し、それ以外の場合は `false ` を返します。

const QScxmlEvent &QScxmlCppDataModel::scxmlEvent() const

ステートマシンによって現在処理されているイベントを保持します。

_event 変数の説明については、SCXML仕様 - 5.10 システム変数も参照してください。

現在処理中のイベントを返します。

setScxmlEvent()も参照してください 。

[override virtual] QVariant QScxmlCppDataModel::scxmlProperty(const QString &name) const

QScxmlDataModel::scxmlProperty(const QString &name) const を再実装します。

このメソッドは常に空の `QVariant ` を返し、`name` は無視します。各種要素の `location ` 属性を通じてデータモデルのプロパティを検索する機能を実装するには、このメソッドをオーバーライドしてください。

setScxmlProperty()も参照してください 。

[override virtual] void QScxmlCppDataModel::setScxmlEvent(const QScxmlEvent &event)

QScxmlDataModel::setScxmlEvent(const QScxmlEvent &event) を再実装します。

次に処理されるevent を設定します。

「QScxmlCppDataModel::scxmlEvent」も参照してください 。

[override virtual] bool QScxmlCppDataModel::setScxmlProperty(const QString &name, const QVariant &value, const QString &context)

QScxmlDataModel::setScxmlProperty(const QString &name, const QVariant &value, const QString &context) を再実装します。

このメソッドは常に `false ` を返し、`name`、`value`、および `context` を無視します。各種要素の `location ` 属性を通じてデータモデルのプロパティを検索する機能を実装するには、このメソッドをオーバーライドしてください。

scxmlProperty()も参照してください 。

[override virtual invokable] bool QScxmlCppDataModel::setup(const QVariantMap &initialDataValues)

QScxmlDataModel::setup(const QVariantMap &initialDataValues) を再実装します。

ステートマシンの初期化中に呼び出され、キーで指定されたデータモデル変数の初期値(initialDataValues )を使用してステートマシンを設定します。これらは、<invoke> 要素内の<param> タグで指定された値です。

成功した場合、true を返します。

注:この関数は 、メタオブジェクトシステムを介して、またQMLから呼び出すことができます。Q_INVOKABLE を参照してください。

「QScxmlStateMachine::init」も参照してください 。

© 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.