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> また、condexpr属性では、それぞれの 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 を無視し、okfalse に設定します。<assign> を実装するには、特定のデータモデルでこのメソッドをオーバーライドします。

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

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

このメソッドは何も実行せず、idbody を無視し、okfalse に設定します。<foreach> を実装するには、特定のデータモデルでこのメソッドをオーバーライドしてください。

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

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

このメソッドは何も実行せず、id を無視し、okfalse に設定します。<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 Specification - 5.10 System Variablesも参照してください。

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

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も参照して ください。

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