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等应该是类似的,后续会继续分析;内容实在太多,具体函数解释暂放下一篇;
qt源码学习---QMetaObject(二)相关推荐
- 基于Qt5.14.2和mingw的Qt源码学习(三) — 元对象系统简介及moc工具是如何保存类属性和方法的
基于Qt5.14.2和mingw的Qt源码学习(三) - 元对象系统简介及moc工具是如何保存类属性和方法的 一.什么是元对象系统 1.元对象系统目的 2.实现元对象系统的关键 3.元对象系统的其他一 ...
- 第十四课 k8s源码学习和二次开发原理篇-调度器原理
第十四课 k8s源码学习和二次开发原理篇-调度器原理 tags: k8s 源码学习 categories: 源码学习 二次开发 文章目录 第十四课 k8s源码学习和二次开发原理篇-调度器原理 第一节 ...
- 第八课 k8s源码学习和二次开发原理篇-KubeBuilder使用和Controller-runtime原理
第八课 k8s源码学习和二次开发原理篇-KubeBuilder使用和Controller-runtime原理 tags: k8s 源码学习 categories: 源码学习 二次开发 文章目录 第八课 ...
- 第三课 k8s源码学习和二次开发-缓存机制Informers和Reflector组件学习
第三课 k8s源码学习和二次开发-缓存机制Informers和Reflector组件学习 tags: k8s 源码学习 categories: 源码学习 二次开发 文章目录 第三课 k8s源码学习和二 ...
- 第四课 k8s源码学习和二次开发-DeltaFIFO和Indexer原理学习
第四课 k8s源码学习和二次开发-DeltaFIFO和Indexer原理学习 tags: k8s 源码学习 categories: 源码学习 二次开发 文章目录 第四课 k8s源码学习和二次开发-De ...
- Shiro源码学习之二
接上一篇 Shiro源码学习之一 3.subject.login 进入login public void login(AuthenticationToken token) throws Authent ...
- vuex commit 模块_长篇连载:Vuex源码学习(二)脉络梳理
前车之鉴 有了vue-router源码学习的经验,每次看认真钻研源代码的时候都会抽出一小段时间来大体浏览一遍源代码.大体了解这个源代码的脉络,每个阶段做了什么,文件目录的划分.下面我来带大家梳理一下V ...
- client-go源码学习(二):Reflector、DeltaFIFO
本文基于Kubernetes v1.22.4版本进行源码学习,对应的client-go版本为v0.22.4 3.Informer机制 在Kubernetes系统中,组件之间通过HTTP协议进行通信,在 ...
- Soul API 网关源码学习《二》
基于examples下面的 http服务进行源码解析 前言 上一篇文章Soul API 网关源码解析<一> 中简单介绍了一下网关的含义,同时介绍了两种微服务开发常用的网关:Zuul 1.x ...
最新文章
- 【AAAI Oral】利用深度增强学习自动解数学题,准确率提升15%
- 用Python就可以给你的头像戴上圣诞帽,别@微信团队了!
- ASP.NET MVC Framework体验(1):从一个简单实例开始
- python中popen转变时区_python中的subprocess.Popen()使用
- ES5和ES6中对于继承的实现方法
- 数据遍历打印得小列子
- python替换文件中的字符串_Python文件操作中进行字符串替换的方法(保存到新文件/当前文件)...
- 总结列表显示ListView知识点
- C语言贪吃蛇小游戏 | 源码
- 通过Modbus转EtherNetIP网关连接AB PLC的配置案例
- 5g理论速度_5G手机用4G套餐速度达300M每秒,其原因令人费解,西瓜视频聊科技...
- 不意外:Facebook上市遭遇滑铁卢
- CDH集群更换ip,主机名
- 嵌入式行业和职业选择的看法
- 多个excel表格数据汇总如何完成
- xdm,外包能干吗?
- 【C++】公积金贷款计算器
- neo4j ogm_带有Hibernate OGM的NoSQL –第二部分:查询数据
- 从面向对象的设计模式看软件设计
- Java实现阿姆斯特朗数
热门文章
- 数据库--数据备份与恢复
- Import Legacy CCSv3.3 Project到CCS5.5.0时出错
- GitHub是什么?怎么用?Git是什么?怎么用?
- java基础面试题-
- js中对数组的增删方法:push(),pop(),unshift(),shift(),splice()的用法小结
- Java 校验注解的使用、自定义校验注解
- Magento 数据库EVA
- 最强损失函数分析:一般自适应鲁棒损失函数
- Tomcat部署war包项目
- 汽车学堂 自 动 驾 驶 决 策 与 控 制 算 法——现 代 控 制 理 论学习(一)