이 페이지에서

SCXML 미디어 플레이어

C++ 데이터 모델로 데이터를 전송하고 수신합니다.

왼쪽에 재생 목록이 표시되고 오른쪽에 ‘정지’ 상태가 표시된 미디어 플레이어

미디어 플레이어는 C++ 데이터 모델에서 데이터에 액세스하는 방법을 보여줍니다. 이 데이터 모델을 사용하면 expr 속성과 <script> 요소에 대한 C++ 코드를 작성할 수 있습니다. 데이터 모델의 데이터 부분은 QScxmlCppDataModel 의 서브클래스로 구현되며, 이에 대한 디스패치 메서드는 Qt SCXML 컴파일러(qscxmlc)가 생성합니다.

UI는 Qt Quick 를 사용하여 생성됩니다.

예제 실행

다음 위치에서 예제를 실행할 수 있습니다.

C++ 데이터 모델 사용

SCXML 파일에서 <scxml> 요소의 datamodel 속성 값으로 데이터 모델을 지정합니다.

<scxml
    xmlns="http://www.w3.org/2005/07/scxml"
    version="1.0"
    name="MediaPlayerStateMachine"
    initial="stopped"
    datamodel="cplusplus:TheDataModel:thedatamodel.h"

datamodel 속성의 형식은 다음과 같습니다: cplusplus:<class-name>:<classdef-header>. 따라서 QScxmlCppDataModel 의 서브클래스가 포함된 thedatamodel.h라는 파일이 필요합니다:

#include "qscxmlcppdatamodel.h"
#include <QtQml/qqml.h>

class TheDataModel: public QScxmlCppDataModel
{
    Q_OBJECT
    Q_SCXML_DATAMODEL

QScxmlCppDataModel 이 클래스는 ` QObject`에서 파생되므로, 정의의 private 섹션에서 괄호 열기 바로 뒤에 ` Q_OBJECT ` 매크로를 추가합니다. 그런 다음 ` Q_OBJECT` 뒤에 ` Q_SCXML_DATAMODEL ` 매크로를 배치합니다. 이 매크로는 가상 메서드의 선언으로 확장되며, 해당 구현은 ` Qt SCXML ` 컴파일러에 의해 생성됩니다.

SCXML 파일에서는 <script> 요소에 C++ 문장을 지정하고, expr 속성을 사용하여 데이터 모델에 접근합니다:

    <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>

        <onexit>
            <send event="playbackStopped">
                <param name="media" expr="media"/>
            </send>
        </onexit>

        <transition event="tap" cond="!isValidMedia() || media == eventData().value(QStringLiteral(&quot;media&quot;))" target="stopped"/>
        <transition event="tap" cond="isValidMedia() &amp;&amp; media != eventData().value(QStringLiteral(&quot;media&quot;))" target="playing"/>
    </state>

Qt SCXML 컴파일러는 다양한 evaluateTo 메서드를 생성하고, 표현식과 스크립트를 mediaplayer.cpp 내 해당 메서드 내부의 람다 표현식으로 변환합니다:

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(); }();
....
}

예제 프로젝트 @ code.qt.io

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