티스토리 뷰

개발/QT, QML

[QT,QML] QQmlEngine::setObjectOwnership 함수

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

QQmlEngine::setObjectOwnership

QQmlEngine::setObjectOwnership 함수는 QML에서 객체의 소유권(ownership)을 설정하는 데 사용됩니다. QML에서 C++로부터 전달받은 객체의 수명을 관리할 수 있는 방법을 지정하여, 메모리 관리에 관련된 문제를 방지할 수 있도록 돕습니다. QML에서는 객체의 소유권을 설정함으로써 누가 객체의 수명을 관리하는지, 즉 언제 객체를 해제할지 명확히 할 수 있습니다. 이 함수는 C++과 QML 간의 소유권 관리에 있어서 중요한 역할을 합니다.

 

 

 

기본 문법

enum QQmlEngine::ObjectOwnership {
    CppOwnership,  // C++에서 객체의 수명 관리
    JavaScriptOwnership // QML 엔진에서 객체의 수명 관리
};

static void QQmlEngine::setObjectOwnership(QObject *object, QQmlEngine::ObjectOwnership ownership);

소유권 옵션

  1. CppOwnership:
    • 객체의 수명은 C++에서 관리합니다.
    • QML이 객체를 해제하지 않으며, 사용자가 객체를 삭제할 책임이 있습니다.
    • 일반적으로 C++ 코드에서 명시적으로 생성하고, 명시적으로 삭제하고자 할 때 사용됩니다.
  2. JavaScriptOwnership:
    • QML 엔진이 객체의 수명을 관리합니다.
    • QML 엔진이 더 이상 객체를 참조하지 않게 되면, 객체를 자동으로 삭제합니다.
    • 동적으로 생성된 객체를 QML에 넘길 때 주로 사용됩니다.

 

 

 

사용 예제

아래 예제에서는 setObjectOwnership을 통해 QML에서 객체의 소유권을 설정하는 방법을 보여줍니다.

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

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

    // C++ 객체 생성
    MyObject *myObject = new MyObject();

    // QML 엔진에 객체를 전달하고, 소유권을 설정
    engine.rootContext()->setContextProperty("myObject", myObject);
    QQmlEngine::setObjectOwnership(myObject, QQmlEngine::JavaScriptOwnership);

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

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

    return app.exec();
}

 

 

 

QML에서의 접근

위에서 설정한 "myObject"는 QML에서 사용할 수 있으며, QML 엔진이 그 객체의 소유권을 가지고 있기 때문에 QML에서 해당 객체를 해제할 수 있습니다.

CppOwnership과 JavaScriptOwnership 비교

  • CppOwnership:
    • 객체의 수명을 C++에서 제어하기 때문에 메모리 관리를 직접 처리해야 합니다.
    • 주로 객체가 특정 라이프사이클을 따라야 하거나, 다른 C++ 코드에서 여러 곳에서 사용될 때 유용합니다.
    • C++에서 명시적으로 delete를 호출해야 합니다.
  • JavaScriptOwnership:
    • 객체의 수명을 QML 엔진이 관리하므로, 더 이상 QML에서 필요하지 않으면 자동으로 삭제됩니다.
    • UI에 동적으로 생성한 객체를 넘길 때 유용하며, 메모리 누수 위험을 줄일 수 있습니다.

 

 

 

예제 상황

만약 C++에서 생성한 객체를 QML에 넘겨 UI에서 사용하지만, 객체가 특정 시점에 자동으로 파괴되길 원한다면 JavaScriptOwnership을 사용하는 것이 좋습니다. 반면, 객체의 수명을 직접 제어하고자 하거나 여러 다른 모듈에서 객체를 사용해야 할 경우 CppOwnership을 선택하여 수동으로 객체를 관리할 수 있습니다.

 

 

 

주의사항

  • 잘못된 소유권 설정은 메모리 누수 또는 잘못된 메모리 접근을 초래할 수 있습니다. 객체가 C++에서 관리되도록 설정했는데 QML에서 삭제를 시도하거나, 반대로 QML에서 관리되도록 설정했는데 C++에서 삭제를 시도하면 문제가 발생할 수 있습니다.

QQmlEngine::setObjectOwnership은 QML과 C++ 간의 객체 수명 관리를 명확히 하여, 메모리 관리 문제를 줄이고 안정적인 프로그램 동작을 보장하는 데 필수적인 역할을 합니다. 이를 잘 이해하고 적절히 사용하는 것이 안정적인 QML 애플리케이션 개발에 매우 중요합니다.

 

 


 

 

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

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

 

 

야 냐두 할 수 있어!!!

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

 

작심삼주 오블완 챌린지

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

www.tistory.com