티스토리 뷰
반응형
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);
이 함수는 두 가지 오버로드를 제공합니다:
- QObject 포인터를 전달하여 QML에서 해당 객체를 사용할 수 있도록 하는 방법.
- 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
'개발 > QT, QML' 카테고리의 다른 글
[QT,QML] C++과 QML 간의 시그널-슬롯 통신 (0) | 2024.11.08 |
---|---|
[QT,QML] QML의 Connections (2) | 2024.11.07 |
[QT,QML] Q_PROPERTY의 MEMBER 키워드 (5) | 2024.11.06 |
[QT,QML] Q_PROPERTY 매크로 (1) | 2024.11.06 |
[QT,QML] QQmlEngine::setObjectOwnership 함수 (3) | 2024.11.05 |