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