You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 03:05:18