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=能直接写入对应类型的值

浙公网安备 33010602011771号