1、由于QMetaObject依赖于QMetaMethod、QMetaEnum、QMetaProperty、QMetaClassInfo等类,本篇先看下QMetaMethod方法的实现;
2、QMetaMethod实现如下:
2、
Q_DECL_CONSTEXPR的主要作用是声明QMetaMethod是字面值常量类,在一定程度上可以优化执行效率;至于constexpr的详细作用,可以百度了解;
3、
methodSignature是方法签名,主要在QMethodPrivate中实现,具体如下:
Q_ASSERT(priv(mobj-d.data)->revision >= 7);主要是用来判断此方法当前qt版本是否支持;
priv函数返回QMetaObjectPrivate对象,其定义如下:
,由源码可知,qt版本必须在5.0以上才能支持signature方法;
QMetaObjectPrivate类中存储了QMetaObject对应的方法所以及相应数据的索引,后续会继续分析;
接下来继续看QMetaMethodPrivet中signature方法中调用的函数:
name函数:
注意:此处mobj是QMetaObject类对象,QMetaObject成员变量d是一个结构体,其在QMetaObject中定义如下:
此处uint *data指针存储的应该是每个方法及类型信息在stringdata中存储的索引位置;
此处简要说明下匿名结构体的作用:
假设类A继承QObject,那么类A中的QMetaObject如何实现继承呢?
QMetaObject利用SuperData superdata关联其父类,每次查找对应的方法时,先从父类QObject中检索,如果找不到,在从子类A中检索;superdata起到类似链表的头指针的作用;
QObject中有一个QMetaObject静态成员变量staticQtMetaObject,所以任何QObject的子类最终都会指向staticQtMetaObject这个静态变量;
const QByteArrayData *stringdata:存储Q_INVOKABLE、signals、slots等标记的成员函数名称,类似于c语言中的字符串数组,其具体索引有const uint *data存储;
const uint *data:存储方法、属性等索引位置,其从第14个索引位置开始,前14个数据主要存储
以上信息,data[0]对应的revision,data[1]对应的className,以次类推;
QMetaMethod中handle成员变量记录其每个方法在QMetaObject::data中的索引下标,类似于c语言中指针的指针;其关系大致如下:
其他属性,如构造函数、枚举变量、property等应该是类似的,后续会继续分析;内容实在太多,具体函数解释暂放下一篇;