Qt反射简化定义

 

 

template<typename T>
class ReflectProperty {
public:
    ReflectProperty() : m_value{} {}
    ReflectProperty(const T& v) : m_value(v) {}

    ReflectProperty& operator=(const T& v) { m_value = v; return *this; }
    operator T() const { return m_value; }

    T get() const { return m_value; }
    void set(const T& v) { m_value = v; }

private:
    T m_value;
};
模板类

 

// ===== 内部 =====
#define _REFLECT_rw(Type, Name, GetPrefix, SetPrefix) \
    Q_PROPERTY(Type Name READ GetPrefix##Name WRITE SetPrefix##Name) \
    Type GetPrefix##Name() const { return m_##Name.get(); } \
    void SetPrefix##Name(const Type& v) { m_##Name.set(v); }

#define _REFLECT_r(Type, Name, GetPrefix, SetPrefix) \
    Q_PROPERTY(Type Name READ GetPrefix##Name) \
    Type GetPrefix##Name() const { return m_##Name.get(); }

#define _REFLECT_w(Type, Name, GetPrefix, SetPrefix) \
    Q_PROPERTY(Type Name WRITE SetPrefix##Name) \
    void SetPrefix##Name(const Type& v) { m_##Name.set(v); }

#define _REFLECT_n(Type, Name, GetPrefix, SetPrefix)

// ===== 对外宏 =====

// 默认前缀
#define REFLECT(Mode, Type, Name, Default) \
    _REFLECT_##Mode(Type, Name, get_, set_) \
    ReflectProperty<Type> m_##Name{Default};

// 自定义前缀
#define REFLECT_N(Mode, Type, Name, GetPrefix, SetPrefix, Default) \
    _REFLECT_##Mode(Type, Name, GetPrefix, SetPrefix) \
    ReflectProperty<Type> m_##Name{Default};
定义宏

 

class Test : public QObject {
    Q_OBJECT
public:
    REFLECT_N(rw, int, test1, gggg, ssss,999);
    // 读写,默认 100
    REFLECT(r, QString, test2, "99");   
    REFLECT(w, double, test3, 3.14);  
    REFLECT(n, int, test4);

public:
    explicit Test(QObject* parent = nullptr) : QObject(parent) {}
};
测试类

 

    Test ss;
    // 反射遍历 + 读取
    const QMetaObject* mo = ss.metaObject();
    for (int i = mo->propertyOffset(); i < mo->propertyCount(); ++i) {
        QMetaProperty prop = mo->property(i);
        if (prop.isReadable())
            qDebug() << prop.name() << prop.typeName() << ss.property(prop.name());

        if (prop.isWritable())
        {
            qDebug() << prop.name() << prop.typeName() << "Write";
            ss.setProperty(prop.name(), QVariant());
        }
    }
测试代码

 

 

原理就是利用Qt的Q_PROPERTY进行参数定义的

Q_PROPERTY(类型 名称 READ 读取函数名称 WRITE 写入函数名称)

其中READ和WRITE可以单独写,只读或只写或者都不要只是定义出来

 

ReflectProperty就是将一个类型进行封装,内部有get和set函数,重载了operator=能直接写入对应类型的值

 

posted @ 2026-08-27 17:58  WB-TT  阅读(3)  评论(0)    收藏  举报