QScxmlCppDataModel Class

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

Header: #include <QScxmlCppDataModel>
CMake: find_package(Qt6 REQUIRED COMPONENTS Scxml)
target_link_libraries(mytarget PRIVATE Qt6::Scxml)
qmake: QT += scxml
Inherits: 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.h"

class TheDataModel: public QScxmlCppDataModel
{
    \Q_OBJECT
    Q_SCXML_DATAMODEL
};

Q_SCXML_DATAMODELは、クラス定義のprivateセクション、例えば開始括弧の直後、またはQ_OBJECT マクロの後に記述する必要があります。Q_SCXML_DATAMODEL はクラス定義の private セクションに記述する必要があります。このマクロは 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> また、cond属性やexpr属性では、それぞれのboolやQVariant 。そして、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も参照してください

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