티스토리 뷰

개발/QT, QML

[QT,QML] QQmlContext::setContextProperty 함수

부캐: 개발하는 조대리 2024. 11. 5. 09:24
반응형

QQmlContext::setContextProperty

QQmlContext::setContextProperty 함수는 QML에서 사용할 수 있는 데이터와 객체를 QML 엔진에 전달할 때 사용하는 매우 중요한 함수입니다. 이를 통해 C++ 객체나 데이터를 QML 코드에서 직접 접근하고 사용할 수 있게 됩니다. 이 함수는 특히 C++에서 동적으로 생성된 데이터를 QML UI에 결합하고 싶을 때 유용합니다.

 

 

 

기본 문법

void QQmlContext::setContextProperty(const QString &name, QObject *value);
void QQmlContext::setContextProperty(const QString &name, const QVariant &value);

이 함수는 두 가지 오버로드를 제공합니다:

  1. QObject 포인터를 전달하여 QML에서 해당 객체를 사용할 수 있도록 하는 방법.
  2. QVariant를 전달하여 기본형 데이터 타입(예: 정수, 문자열, 리스트 등)을 QML에 연결하는 방법.

 

 

 

주요 용도

  • C++에서 정의한 객체를 QML 코드에서 사용할 수 있도록 설정.
  • QML과 C++ 간의 데이터 공유상호작용을 가능하게 함.
  • 사용자 인터페이스와 백엔드 로직을 통합하여 동적이고 유연한 UI를 구현.

 

 

 

사용 예제

아래 예제에서는 C++에서 생성된 객체를 QML에서 사용하는 방법을 보여줍니다.

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "MyObject.h"

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

    // C++ 객체 생성
    MyObject myObject;

    // QML 컨텍스트에 객체 등록
    engine.rootContext()->setContextProperty("myObject", &myObject);

    // QML 파일 로드
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}

 

 

 

QML에서의 접근

위 예제에서 setContextProperty를 통해 myObject라는 이름으로 QML 컨텍스트에 등록되었기 때문에, QML 코드에서 이를 쉽게 사용할 수 있습니다.

 

main.qml:

import QtQuick 2.15
import QtQuick.Controls 2.15

ApplicationWindow {
    visible: true
    width: 640
    height: 480

    Text {
        text: myObject.someProperty // C++ 객체의 프로퍼티에 접근
        anchors.centerIn: parent
    }

    Button {
        text: "Call Method"
        onClicked: {
            myObject.someMethod() // C++ 객체의 메서드 호출
        }
    }
}

 

 

 

설명

  • engine.rootContext()->setContextProperty("myObject", &myObject): 여기서 "myObject"는 QML에서 사용할 이름이고, &myObject는 실제 C++ 객체입니다. 이렇게 설정하면 QML에서 myObject라는 이름으로 이 객체에 접근할 수 있습니다.
  • QML에서는 등록된 객체의 프로퍼티, 메서드, 신호 등을 활용하여 UI를 동적으로 만들 수 있습니다.

 

주의사항

  • 메모리 관리: setContextProperty로 전달된 객체의 메모리 관리는 프로그래머가 해야 합니다. QML 엔진이 이를 해제하지 않으므로, 수명이 관리되지 않는 객체를 전달하면 메모리 누수가 발생할 수 있습니다.
  • QObject만 가능: 첫 번째 오버로드의 경우, 전달되는 객체는 QObject를 상속해야 합니다. 그렇지 않으면 QML에서 인식할 수 없습니다.

이와 같은 방식으로 QQmlContext::setContextProperty를 사용하면 C++ 로직과 QML UI를 자연스럽게 결합할 수 있으며, 복잡한 UI를 효율적으로 구현할 수 있습니다.

 

 


 

 

개인적으로 학습하면서 정리한 내용입니다.
잘못된 내용이 있을 경우 알려주시면 확인 후 수정 및 반영하도록 하겠습니다.

오늘도 감사합니다.(__)>

 

 

야 냐두 할 수 있어!!!

https://www.tistory.com/event/write-challenge-2024

 

작심삼주 오블완 챌린지

오늘 블로그 완료! 21일 동안 매일 블로그에 글 쓰고 글력을 키워보세요.

www.tistory.com