티스토리 뷰
반응형
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
'개발 > QT, QML' 카테고리의 다른 글
[QT,QML] C++과 QML 간의 시그널-슬롯 통신 (0) | 2024.11.08 |
---|---|
[QT,QML] QML의 Connections (2) | 2024.11.07 |
[QT,QML] Q_PROPERTY 매크로 (1) | 2024.11.06 |
[QT,QML] QQmlEngine::setObjectOwnership 함수 (3) | 2024.11.05 |
[QT,QML] QQmlContext::setContextProperty 함수 (2) | 2024.11.05 |