如何仅获取QObject派生类MyObject自身的Q_PROPERTY属性?
如何获取QObject派生类自身的所有属性(排除基类属性)
问题描述
假设有一个QObject派生类,代码定义如下:
class MyObject : public QObject { Q_OBJECT; Q_PROPERTY(bool myBool READ myBool WRITE setMyBool); //... }请问如何仅获取该派生类MyObject自身的所有属性,而不包含任何基类的属性?
解决方案
利用Qt元对象系统的QMetaObject类,可轻松筛选出当前类自身定义的属性,以下是两种可靠实现方式:
方法一:利用属性偏移量(推荐)
QMetaObject::propertyOffset()会返回当前类中第一个自定义属性的索引,所有基类(比如QObject)的属性索引都小于这个值。从该偏移量开始遍历属性,即可直接获取当前类自身的属性:
#include <QMetaObject> #include <QMetaProperty> #include <QList> QList<QMetaProperty> getMyObjectOwnProperties() { QList<QMetaProperty> ownProperties; const QMetaObject* metaObj = MyObject::staticMetaObject; // 获取当前类属性的起始索引,基类属性均在此之前 int propertyOffset = metaObj->propertyOffset(); for (int i = propertyOffset; i < metaObj->propertyCount(); ++i) { ownProperties.append(metaObj->property(i)); } return ownProperties; }
方法二:检查属性所属元对象
每个QMetaProperty的metaObject()方法会返回定义该属性的类的元对象,判断该元对象是否等于当前类的元对象,即可筛选出自定义属性:
#include <QMetaObject> #include <QMetaProperty> #include <QList> QList<QMetaProperty> getMyObjectOwnProperties() { QList<QMetaProperty> ownProperties; const QMetaObject* metaObj = MyObject::staticMetaObject; for (int i = 0; i < metaObj->propertyCount(); ++i) { QMetaProperty prop = metaObj->property(i); // 仅保留当前类定义的属性 if (prop.metaObject() == metaObj) { ownProperties.append(prop); } } return ownProperties; }
使用示例
获取属性后,可通过以下方式获取属性名或属性值:
// 遍历并打印属性名 QList<QMetaProperty> props = getMyObjectOwnProperties(); for (const QMetaProperty& prop : props) { qDebug() << "属性名:" << prop.name(); } // 读取对象实例的属性值 MyObject obj; for (const QMetaProperty& prop : props) { qDebug() << prop.name() << "的值:" << prop.read(&obj); }
内容的提问来源于stack exchange,提问作者Baumflaum
相关产品推荐
相关产品推荐

