qt源码学习---QMetaObject(二)

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等应该是类似的,后续会继续分析;内容实在太多,具体函数解释暂放下一篇;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值