이 페이지에서

컨텍스트 속성을 사용하여 C++ 객체를 QML에 삽입하기

경고: QML 코드에서 컨텍스트 속성을사용하면 , 코드를 작성할 때 염두에 둔 특정 컨텍스트에 대한 의존성이 생성됩니다. 이는 코드가 사용될 다른 곳에서 컨텍스트가 다를 수 있으므로 코드의 재사용성을 제한합니다. 게다가 이러한 의존성은 명시적으로 선언되지 않습니다. 컨텍스트를 명시적으로 import 하거나 예상되는 컨텍스트를 어떤 방식으로든 명시하지 않습니다. 따라서 코드를 재사용하려는 사람은 재사용하려는 위치에 해당 코드를 실행하는 데 충분한 컨텍스트가 있는지 파악하기 어려울 것입니다.

경고: 컨텍스트 속성은 QML 코드를 QML 엔진에 로드하기 전에 미리 처리하는 어떤 도구에서도 인식할 수 없습니다. Qt Quick Compiler, qmllint 및 QML Language Server 는 컨텍스트 속성에 대해 전혀 알지 못하며, 컨텍스트 속성에 대한 모든 액세스를 한정되지 않은 액세스로 간주합니다.

참고: 컨텍스트 속성은 일반적으로 컴포넌트의 루트 객체에 정의된 일반 속성이나, C++에서 QML_SINGLETON을 사용하거나 QML에서 pragma Singleton을 사용하여 정의된 싱글톤으로 대체할 수 있습니다.

QML 객체를 C++ 애플리케이션에 로드할 때, QML 코드 내에서 사용할 수 있는 일부 C++ 데이터를 직접 내장하는 것이 유용할 수 있습니다. 이를 통해 예를 들어, 내장된 객체에 대한 C++ 메서드를 호출하거나, C++ 객체 인스턴스를 QML 뷰의 데이터 모델로 사용할 수 있습니다.

QML 객체에 C++ 데이터를 주입하는 기능은 ` QQmlContext ` 클래스를 통해 구현됩니다. 이 클래스는 QML 객체의 컨텍스트에 데이터를 노출하여, QML 코드의 범위 내에서 해당 데이터를 직접 참조할 수 있도록 합니다.

간단한 컨텍스트 속성 설정

예를 들어, 다음은 현재 범위 내에 존재하지 않는 ` currentDateTime ` 값을 참조하는 QML 항목입니다.

// MyItem.qml
import QtQuick

Text { text: currentDateTime }

이 ` currentDateTime ` 값은 QML 컴포넌트를 로드하는 C++ 애플리케이션에서 ` QQmlContext::setContextProperty()`를 사용하여 직접 설정할 수 있습니다:

QQuickView view;
view.rootContext()->setContextProperty("currentDateTime", QDateTime::currentDateTime());
view.setSource(QUrl::fromLocalFile("MyItem.qml"));
view.show();

참고: QML에서 평가되는 모든 표현식은 특정 컨텍스트에서평가되므로 , 컨텍스트가 수정되면 해당 컨텍스트 내의 모든 바인딩이 재평가됩니다. 따라서 컨텍스트 속성은 애플리케이션 초기화 단계 이외에서는 신중하게 사용해야 하며, 그렇지 않을 경우 애플리케이션 성능 저하를 초래할 수 있습니다.

객체를 컨텍스트 속성으로 설정하기

컨텍스트 속성은 ` QVariant ` 또는 ` QObject*` 값을 가질 수 있습니다. 즉, 이 방식을 사용하여 사용자 정의 C++ 객체를 주입할 수 있으며, 이러한 객체는 QML에서 직접 수정하고 읽을 수 있습니다. 여기서는 위 예제를 수정하여 ` QDateTime ` 값 대신 ` QObject ` 인스턴스를 삽입하고, QML 코드에서 해당 객체 인스턴스의 메서드를 호출하도록 합니다:

C++
class ApplicationData : public QObject
{
    Q_OBJECT
public:
    Q_INVOKABLE QDateTime getCurrentDateTime() const {
        return QDateTime::currentDateTime();
    }
};

int main(int argc, char *argv[]) {
    QGuiApplication app(argc, argv);

    QQuickView view;

    ApplicationData data;
    view.rootContext()->setContextProperty("applicationData", &data);

    view.setSource(QUrl::fromLocalFile("MyItem.qml"));
    view.show();

    return app.exec();
}
QML
// MyItem.qml
import QtQuick

Text { text: applicationData.getCurrentDateTime() }

(C++에서 QML로 반환된 날짜/시간 값은 ` Qt.formatDateTime()` 및 관련 함수를 통해 서식을 지정할 수 있습니다.)

QML 항목이 컨텍스트 속성으로부터 신호를 수신해야 하는 경우, ` Connections ` 유형을 사용하여 해당 신호에 연결할 수 있습니다. 예를 들어, ` ApplicationData `에 ` dataChanged()`라는 신호가 있는 경우, ` Connections ` 객체 내의 ` onDataChanged ` 핸들러를 사용하여 이 신호에 연결할 수 있습니다:

Text {
    text: applicationData.getCurrentDateTime()

    Connections {
        target: applicationData
        onDataChanged: console.log("The application data changed!")
    }
}

자세한 내용은 QQmlContext 문서를 참조하십시오.

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