티스토리 뷰

개발/QT, QML

[QT,QML] Q_PROPERTY의 MEMBER 키워드

부캐: 개발하는 조대리 2024. 11. 6. 20:17
반응형

MEMBER

Q_PROPERTY 매크로의 MEMBER 키워드는 클래스 멤버 변수를 직접적으로 Q_PROPERTY로 노출하는 데 사용됩니다. MEMBER를 사용하면 별도의 Getter/Setter 함수를 정의할 필요 없이 클래스 멤버 변수를 바로 프로퍼티로 연결할 수 있어 코드를 간결하게 만들 수 있습니다.

 

 

 

 기본 문법

Q_PROPERTY(type name MEMBER memberVariable [NOTIFY notifySignal])
  • type: 프로퍼티의 자료형 (예: int, QString 등).
  • name: 프로퍼티의 이름.
  • MEMBER memberVariable: Q_PROPERTY와 연결할 클래스 멤버 변수.
  • NOTIFY notifySignal: 멤버 변수의 값이 변경될 때 발생할 시그널 (선택적).

 

 

 

 사용 예제

아래 예제에서는 MEMBER 키워드를 사용하여 클래스 멤버 변수를 QML에 바로 노출하는 방법을 보여줍니다.

#include <QObject>
#include <QString>

class Person : public QObject {
    Q_OBJECT
    Q_PROPERTY(QString name MEMBER m_name NOTIFY nameChanged)

public:
    explicit Person(QObject *parent = nullptr) : QObject(parent) {}

signals:
    void nameChanged(); // 프로퍼티 값 변경 시 알리는 시그널

private:
    QString m_name; // QML에 노출할 멤버 변수
};

설명

  • MEMBER m_name:
    • m_name이라는 멤버 변수를 Q_PROPERTY에 바로 연결합니다.
    • 이로 인해 QML에서 name이라는 프로퍼티로 멤버 변수에 접근하고 사용할 수 있습니다.
  • NOTIFY nameChanged:
    • nameChanged() 시그널은 m_name의 값이 변경되었음을 알리기 위해 사용됩니다. QML에서 자동으로 UI가 갱신될 수 있도록 합니다.

 

 

 

 QML에서 사용하기

위와 같이 MEMBER 키워드로 정의된 프로퍼티는 QML에서 쉽게 접근할 수 있습니다.

 

C++에서 QML에 등록:

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

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

    Person person;
    person.setProperty("name", "Alice"); // Q_PROPERTY로 등록된 멤버 변수 설정

    engine.rootContext()->setContextProperty("person", &person);

    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

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

    return app.exec();
}

 

main.qml:

import QtQuick 2.15
import QtQuick.Controls 2.15

ApplicationWindow {
    visible: true
    width: 640
    height: 480

    Text {
        text: person.name // person 객체의 name 프로퍼티 사용
        anchors.centerIn: parent
    }

    Button {
        text: "Change Name"
        onClicked: person.name = "Bob" // 프로퍼티 변경, 자동으로 UI 업데이트
    }
}

 

 

 

 MEMBER 사용의 장점과 단점

장점

  • 간결한 코드: Getter/Setter 함수를 정의할 필요 없이 간단히 멤버 변수를 직접 노출할 수 있습니다.
  • 빠른 개발: 개발 속도가 빨라지며, 프로퍼티가 간단할 경우 코드가 훨씬 읽기 쉬워집니다.

단점

  • 데이터 캡슐화 부족: 멤버 변수에 직접 접근하는 방식이기 때문에, 데이터 캡슐화(Encapsulation) 측면에서 제한이 있을 수 있습니다. 멤버 변수에 대한 제어가 필요하거나 추가적인 로직(유효성 검사 등)이 필요하다면 Getter/Setter를 사용하는 것이 좋습니다.
  • 추가 로직의 어려움: 멤버 변수에 직접 접근하므로, 값 설정 시 부가적인 작업을 수행할 수 없습니다. 이런 경우에는 반드시 Getter/Setter 함수를 사용해야 합니다.

MEMBER 키워드는 간단한 프로퍼티를 QML에 노출할 때 유용하지만, 데이터 접근에 대해 더 많은 제어가 필요하거나 값 변경 시 추가적인 처리가 필요하다면 Getter와 Setter를 사용하는 것이 더 적절합니다.

 

 


 

 

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

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

 

 

야 너두 할 수 있어!!!

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

 

작심삼주 오블완 챌린지

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

www.tistory.com