目录
- 使用场景
- 元对象相关类及宏
- 常用功能
- 获取类相关内容以及委托调用
使用场景
Qt基于强大的元对象系统实现反射机制;
在复杂的开发需求中,我们希望通过一些手段映射出我们的类(映射对象)
然后直接使用,通过(映射对象)中提供的字段属性的设置接口,方法委托调用的调用接口可以很好的实现我们的需求
元对象相关类及宏
类
QMetaClassInfo
QMetaEnum 处理枚举
QMetaObject 处理对象
QMetaProperty 处理属性
QMetaMethod 处理方法
QMetaType 处理类型
宏
Q_PROPERTY属性
Q_INVOKABLE方法
常用功能
先创建一个派生QObject的类SysUser
SysUser.h
#ifndef SYSUSER_H
#define SYSUSER_H#include <QObject>class SysUser : public QObject
{Q_OBJECTQ_PROPERTY(int id READ getId WRITE setId)public:explicit SysUser(QObject *parent = nullptr);SysUser(const SysUser &other);public:Q_INVOKABLE int getId();Q_INVOKABLE void setId(int id);private:int id;signals:public slots:
};#endif // SYSUSER_H
SysUser.cpp
#include "SysUser.h"
#include <QDebug>SysUser::SysUser(QObject *parent) : QObject(parent)
{id = 1;
}SysUser::SysUser(const SysUser &other)
{}int SysUser::getId()
{return id;
}void SysUser::setId(int id)
{this->id = id;
}
获取类相关内容以及委托调用
qDebug()<< SysUser::staticMetaObject.className(); //获取类名qDebug()<< SysUser::staticMetaObject.propertyCount(); //获取属性个数qDebug()<< SysUser::staticMetaObject.methodCount(); //获取方法个数qDebug()<< SysUser::staticMetaObject.constructorCount(); //获取构造器个数//-----属性相关, 只能操作Q_PROPERTY暴露的属性SysUser user;qDebug()<< user.setProperty("id","123"); //修改属性值qDebug()<< user.property("id"); //获取属性值qDebug()<< SysUser::staticMetaObject.property(1).name(); //获取属性名qDebug()<< SysUser::staticMetaObject.property(1).isWritable(); //判断属性是否可写qDebug()<< SysUser::staticMetaObject.property(1).isReadable(); //判断属性是否可读qDebug()<< SysUser::staticMetaObject.property(1).typeName(); //获取属性类型名qDebug()<< SysUser::staticMetaObject.property(1).userType(); //获取属性类型值qDebug()<< SysUser::staticMetaObject.property(1).type(); //获取属性QVariant类型枚举qDebug()<< SysUser::staticMetaObject.property(1).isUser(); //判断是否为用户自定义类型属性, 用QMetaType注册的类型qDebug()<< SysUser::staticMetaObject.property(1).isValid(); //判断是否有效//-----方法相关,只能操作Q_INVOKABLE暴露的方法qDebug()<< SysUser::staticMetaObject.method(5).name(); //获取方法名int res;QMetaObject::invokeMethod(&user,"getId",Qt::DirectConnection, Q_RETURN_ARG(int,res)); //同步执行//QMetaObject::invokeMethod(&user,"getId",Qt::QueuedConnection, Q_RETURN_ARG(int,res)); //异步执行qDebug()<< res;//-----动态构造,只能操作qRegisterMetaType<SysUser>("SysUser");注册了的类型qDebug()<< QMetaType::type("SysUser"); //=0表示找不到此类型qDebug()<< QMetaType::create(QMetaType::type("SysUser"));//构造对象