Qt反射机制一

1.概述

reflection 模式(反射模式或反射机制):是指在运行时,能获取任意一个类对象的所有类型
信息、属性、成员函数等信息的一种机制。

2.Qt 具体实现反射机制的方法

①、Qt 使用了一系列的类来实现反射机制,这些类对对象的各个方面进行了描述,其中
QMetaObject 类描述了QObject 及其派生类对象的所有元信息,该类是Qt 元对象系
统的核心类,通过该类的成员函数可以获取QObject 及其派生类对象的所有元信息,
因此可以说QMetaObject 类的对象是Qt 中的元对象。注意:要调用QMetaObject 类
中的成员函数需要使用QMetaObject 类型的对象。
②、对对象的成员进行描述:一个对象包含数据成员、函数成员、构造函数、枚举成员等
成员,在Qt 中,这些成员分别使用了不同的类对其进行描述,比如函数成员使用类
QMetaMethod 进行描述,属性使用QMetaProperty 类进行描述等,然后使用
QMetaObject 类对整个类对象进行描述,比如要获取成员函数的函数名,其代码如下:
QMetaMethod qm = metaObject->method(1); //获取索引为1 的成员函数
qDebug()<<qm.name()<<"\n"; //输出该成员函数的名称。

3、使用Qt 反射机制的条件

①、需要继承自QObject 类,并需要在类之中加入Q_OBJECT 宏。
②、注册成员函数:若希望普通成员函数能够被反射,需要在函数声明之前加入
QObject::Q_INVOKABLE 宏。
③、注册成员变量:若希望成员变量能被反射,需要使用Q_PROPERTY 宏。

4、Qt 反射机制实现原理简述

①、Q_OBJECT 宏展开之后有一个虚拟成员函数meteObject(),该函数会返回一个指向
QMetaObject 类型的指针,其原型为
virtual const QMetaObject *metaObject() const;
因为启动了元对象系统的类都包含Q_OBJECT 宏,所以这些类都有含有metaObject()
虚拟成员函数,通过该函数返回的指针调用QMetaObject 类中的成员函数,便可查询
到QObject 及其派生类对象的各种信息。
②、Qt 的moc 会完成以下工作
为 Q_OBJECT 宏展开后所声明的成员函数的成生实现代码
识别 Qt 中特殊的关键字及宏,比如识别出Q_PROPERTY 宏、Q_INVOKABLE宏、slot、signals 等

猜你喜欢

转载自blog.csdn.net/weixin_41882459/article/details/114026833