Qt/C++ 如何迭代给定类对象的 QMetaObject 属性/数据类型?

Cam*_*olf 4 c++ qt

在 C#/Java 中,我使用反射来读取类的属性。我尝试过使用 Qt,但不知道是否能正确解决我的问题。

一个简单的 Person 类头,注意 3 个属性(id、fname、lname)

#ifndef PERSON_H
#define PERSON_H

#include <QObject>

class Person : public QObject
{
    Q_OBJECT
public:
    explicit Person(QObject *parent = 0);

    int id;

    QString fname;

    QString lname;

    /* ... 50+ more properties here */

    int getId() const;
    void setId(int value);

    QString getFname() const;
    void setFname(const QString &value);

    QString getLname() const;
    void setLname(const QString &value);

    /* ... 50+ more getter/setters here */

signals:

public slots:
};

#endif // PERSON_H
Run Code Online (Sandbox Code Playgroud)

通过以下代码片段,我想打印 Person 类的属性。目的是稍后循环遍历对象集合并根据类属性是否已分配值来加载带有值的 QMap。

Person p;
const QMetaObject *metaObj = p.metaObject();
qDebug() << "class name: " << metaObj->className();
qDebug() << "method count: " << metaObj->methodCount();
qDebug() << "property count: " << metaObj->propertyCount();
qDebug() << "ClassInfo count: " << metaObj->classInfoCount();

qDebug() << "properties: ";
for (int i = metaObj->propertyOffset(); i < metaObj->propertyCount(); ++i)
    qDebug() << metaObj->property(i).type() << " " << metaObj->property(i).typeName();
Run Code Online (Sandbox Code Playgroud)

但是,输出是:

class name:  Person
method count:  5
property count:  1
ClassInfo count:  0
Constructor count:  1
properties:
Run Code Online (Sandbox Code Playgroud)

这些数字没有任何意义,并且不会显示任何属性。

Cam*_*olf 5

谢谢我检查!

修改了类属性声明以反映 Q_PROPERTY

Q_PROPERTY(QString id READ getId WRITE setId)
int id;

Q_PROPERTY(QString fname READ getFName WRITE setFName)
QString fname;

Q_PROPERTY(QString lname READ getLName WRITE setLName)
QString lname;
Run Code Online (Sandbox Code Playgroud)

对对象循环的轻微更新:

qDebug() << "properties: ";
for (int i = metaObj->propertyOffset(); i < metaObj->propertyCount(); ++i) {
        //qDebug() << metaObj->property(i).type() << " " << metaObj->property(i).typeName();
        qDebug() << metaObj->property(i).read(data);

    }
Run Code Online (Sandbox Code Playgroud)

输出是:

class name:  Person
method count:  5
property count:  4
ClassInfo count:  0
Constructor count:  1
properties:
QVariant(int, 12345)
QVariant(QString, "John")
QVariant(QString, "Doe")
Run Code Online (Sandbox Code Playgroud)