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("media")).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 に変換できる任意の 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 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.