컨텍스트 속성을 사용하여 QML에 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!") } }
컨텍스트 속성은 QML 보기에서 C++ 기반 데이터 모델을 사용하는 데 유용할 수 있습니다. 다음 예제를 참조하세요:
QStringList, QList<QObject*> 기반 모델 및 QAbstractItemModel 을 QML 보기에서 사용하는 방법을 보여줍니다.
자세한 내용은 QQmlContext 문서를 참조하세요.
© 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.