2016-07-08 1 views

답변

5

에서 호출됩니다. meta()도 가상이거나 메소드가 될 필요가 없습니다. 프리 스탠딩 기능이어야하며, 전달하는 모든 객체에 적용됩니다. C++은 Java가 아닙니다.

예가 다음과 같습니다. 출력 :

objectName QVariant(QString, "") 
id QVariant(int, 1) 
// https://github.com/KubaO/stackoverflown/tree/master/questions/meta-derived-38268004 
#include <QtCore> 

void meta(QObject * obj) { 
    auto mo = obj->metaObject(); 
    for (int i = 0; i < mo->propertyCount(); i++) 
     qDebug() << mo->property(i).name() << mo->property(i).read(obj); 
} 

struct DataObject : QObject { 
    Q_OBJECT 
}; 

struct User : DataObject { 
    Q_PROPERTY(int id MEMBER m_id) 
    Q_OBJECT 
    int m_id { 1 }; 
}; 

int main() { 
    User user; 
    Q_ASSERT(user.metaObject()->propertyCount() == 2); 
    meta(&user); 
} 

#include "main.moc" 
1

QObject::metaObject() 메소드 즉, QObject 기본 클래스의 메소드를 명시 적으로 호출하고 있습니다. (Class::method() 정적 발송입니다)하지 정적으로, 당신의 meta() 구현에서 QObject:: 부분을 제거하고 그래서 metaObject()의 가상 구현은 런타임

동적 파견을 통해 metaObject()를 호출 할 필요가
관련 문제