自学内容网 自学内容网

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)!