이 페이지에서

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> 요소 내에는 0개 이상의 C++ 문장을 넣을 수 있으며, cond 또는 expr 속성에서는 각각 bool 또는 QVariant 로 변환될 수 있는 모든 C++ 표현식을 사용할 수 있습니다. 또한, ` this ` 포인터도 캡처되므로 데이터 모델(위 예제의 ` media ` 속성)을 호출하거나 액세스할 수 있습니다. 전체 예제는 SCXML 미디어 플레이어를 참조하십시오.

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 사양 - 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도 참조하십시오 .

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