2. qt_c++反射实例
目录
- 使用场景
- 元对象相关类及宏
- 常用功能
- 获取类相关内容以及委托调用
使用场景
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_OBJECT
Q_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"));//构造对象
原文地址:https://blog.csdn.net/adsd1233123/article/details/142591515
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!