728x90
반응형
Qt
에서는 리플렉션(Reflection
) 기능을 지원하기 위해 자체적인 메타 오브젝트 시스템(Meta-Object System
)을 제공합니다.- 이를 통해 런타임에 객체의 타입 정보와 메서드, 속성, 신호 및 슬롯 등에 대한 정보를 동적으로 확인하고 조작할 수 있습니다.
-
- 메타 오브젝트 시스템 (
Meta-Object System
)
- 클래스에 메타데이터를 추가하여 런타임에 해당 클래스의 정보를 확인할 수 있습니다.
- 이를 위해 클래스는 반드시
Q_OBJECT
매크로를 선언해야 하며, Qt의moc
(Meta-Object Compiler
)를 통해 메타데이터가 생성됩니다.
- 메타 오브젝트 시스템 (
-
- 객체의 메타정보(클래스 이름, 메서드, 신호/슬롯, 속성 등)를 제공하는 클래스입니다.
- 모든
QObject
기반 클래스는metaObject()
메서드를 통해 해당 객체의 메타정보를 확인할 수 있습니다.
-
- 메서드 및 속성 정보를 표현하는 클래스입니다.
- 이를 통해 런타임에 메서드 호출이나 속성 접근이 가능합니다.
cpp
#include <QObject>
#include <QMetaObject>
#include <QMetaMethod>
#include <QDebug>
class MyClass : public QObject {
Q_OBJECT
public:
Q_INVOKABLE void myMethod() { qDebug() << "myMethod called"; }
Q_PROPERTY(int myProperty READ myProperty WRITE setMyProperty)
int myProperty() const { return m_myProperty; }
void setMyProperty(int value) { m_myProperty = value; }
private:
int m_myProperty;
};
int main() {
MyClass obj;
const QMetaObject *metaObject = obj.metaObject();
qDebug() << "Class Name:" << metaObject->className();
// 메서드 나열
qDebug() << "Methods:";
for (int i = metaObject->methodOffset(); i < metaObject->methodCount(); ++i) {
QMetaMethod method = metaObject->method(i);
qDebug() << method.methodSignature();
}
// 속성 나열
qDebug() << "Properties:";
for (int i = metaObject->propertyOffset(); i < metaObject->propertyCount(); ++i) {
QMetaProperty property = metaObject->property(i);
qDebug() << property.name() << "Type:" << property.typeName();
}
return 0;
}
cpp
const QMetaObject *metaObject = obj.metaObject();
int methodIndex = metaObject->indexOfMethod("myMethod()");
if (methodIndex >= 0) {
QMetaMethod method = metaObject->method(methodIndex);
method.invoke(&obj); // myMethod called 출력
}
? cpp
const QMetaProperty property = metaObject->property(metaObject->indexOfProperty("myProperty"));
if (property.isValid()) {
property.write(&obj, 42); // myProperty에 42를 설정
int value = property.read(&obj).toInt();
qDebug() << "myProperty Value:" << value; // 42 출력
}
-
Q_OBJECT
매크로 필수
- 메타 오브젝트 기능을 사용하려면 클래스에
Q_OBJECT
매크로를 추가해야 합니다. Q_INVOKABLE
,Q_PROPERTY
같은 키워드를 활용하여 메타정보를 정의할 수 있습니다.
-
- 제한점
- Qt의 리플렉션은 런타임 메타데이터에 기반하며, Java/C#의 리플렉션처럼 모든 클래스에 적용되지는 않습니다.
- 즉,
QObject
를 상속하지 않는 클래스는 메타 오브젝트 시스템에 포함되지 않습니다.
-
- 확장성
- Qt의 메타 오브젝트 시스템은 런타임 객체 관리, 신호/슬롯 연결, 동적 속성 관리 등과 밀접하게 통합되어 있어 매우 유용합니다.
-
- UI 빌더 및 데이터 바인딩
- QML과의 연동에서
Q_PROPERTY
를 활용해 동적으로 속성 업데이트.
-
- 플러그인 시스템
- 런타임에 플러그인 메서드와 속성을 동적으로 검색하고 호출.
-
- 동적 객체 생성
QMetaObject::newInstance()
를 통해 객체를 동적으로 생성.
-
- 테스트 및 디버깅
- 클래스 메타데이터를 출력하여 디버깅 정보를 확인하거나 테스트에 활용.
728x90
반응형
'Qt' 카테고리의 다른 글
Qt 문자열 처리의 안전성을 높이는 매크로: QT_NO_CAST_TO_ASCII와 QT_NO_CAST_FROM_ASCII (0) | 2025.01.08 |
---|---|
Play Store 게시를 위한 Qt 앱 준비 (0) | 2025.01.07 |
QSchematic : Qt 애플리케이션 내에서 플로우차트나 엔지니어링 회로도와 같은 다이어그램 생성 라이브러리 (0) | 2024.12.30 |
Qt 그룹, 라이선스 계약 업데이트 출시 (2024) (1) | 2024.12.02 |
Qt5와 Qt6의 QNetworkReply 오류 처리 시그널 차이점 (0) | 2024.11.27 |