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++ 코드를 작성할 수 있습니다. 데이터 모델의 데이터 부분은 Qt SCXML 컴파일러(qscxmlc
)가 디스패치 메서드를 생성하는 QScxmlCppDataModel의 서브클래스에 의해 지원됩니다. 이 메서드는 런타임에 SCXML 파일을 로드할 때는 사용할 수 없습니다.
<scxml>
요소의 데이터모델 속성을 통해 사용합니다:
<scxml datamodel="cplusplus:TheDataModel:thedatamodel.h" ....>
데이터모델 속성의 형식은 cplusplus:<class-name>:<classdef-header>
입니다. 따라서 위의 예제에서는 최소한 다음을 포함하는 QScxmlCppDataModel의 서브클래스가 포함된 thedatamodel.h 파일이 있어야 합니다:
#include <QScxmlCppDataModel> class TheDataModel: public QScxmlCppDataModel { Q_OBJECT Q_SCXML_DATAMODEL ... };
클래스 정의의 비공개 섹션(예: 여는 대괄호 바로 뒤 또는 Q_OBJECT 매크로 뒤)에 Q_SCXML_DATAMODEL이 나타나야 합니다. 이 매크로는 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>
요소에는 0개 이상의 C++ 문을 넣을 수 있으며, cond 또는 expr 속성에는 해당 bool 또는 QVariant 으로 변환할 수 있는 모든 C++ 표현식을 사용할 수 있습니다. 또한 this
포인터도 캡처되므로 데이터 모델(위 예제에서는 미디어 속성)을 호출하거나 액세스할 수 있습니다. 전체 예제는 SCXML 미디어 플레이어를 참조하세요.
QScxmlStateMachine 및 QScxmlDataModel 을참조하세요 .
멤버 함수 문서
[explicit]
QScxmlCppDataModel::QScxmlCppDataModel(QObject *parent = nullptr)
부모 개체를 사용하여 새 C++ 데이터 모델을 만듭니다 parent.
[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, false
에 지정된 상태인 경우 true
를 반환합니다.
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 를참조하세요 .
© 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.