我有两个类,想获取子类的元信息:
class DataObject : public QObject {
Q_OBJECT
...
public:
virtual void meta() {
const QMetaObject *mo = QObject::metaObject();
for (int i = 0; i < mo->propertyCount(); i++) {
qDebug() << mo->property(i).name() << mo->property(i).read(this);
}
}
...
}
class User : public DataObject {
Q_OBJECT
Q_PROPERTY(int id MEMBER m_id)
...
}
当我在 User
对象上调用 meta 时,它只输出默认对象属性 objectName
,而不输出在 User 类中声明的属性。
我能否以某种方式获取子类的元信息而不用手动实现每个子类中的方法?
最佳答案
您需要通过动态调度调用 metaObject()
,而不是静态调用(Class::method()
是静态调度)。您也不需要 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"
关于c++ - 在子类上调用虚方法返回父类(super class)数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38268004/