QMetaMethod 获取成员函数的元信息
导言:
最近在深入理解一个项目的Demo时,有一个难点困惑了整整一个上午,就是关于QMetaMethod类的使用。查看了官方的手册,懵懵懂懂。搜罗了网上的相关介绍,总算是有些明白了。接着,我就来分享下我的总结吧!
介绍:
QMetaMethod类是用来获取成员方法的元信息的一个类。
通过该类,我们可以获取到一个成员方法的类型,比如它是信号、槽、方法、构造函数;
也可以获得方法的完整签名,以及方法所接受的参数类型和参数名字;
当然也可以获取方法的返回值类型;
还可以使用access()方法获取成员函数的访问权限。
当然,最重要的还是invoke()方法,使用该方法我们可以在任意的QObject对象上调用成员函数。
而要得到一个QMetaMethod类的实例,有如下方法:
- 对于信号,可以使用该类的静态方法fromSignal()来获得相对于该信号的QMetaMethod对象;
- 对于普通成员函数和槽函数,可以使用类的QMetaObject对象来间接获取。分别举例如下:
方法一
QMetaMethod destroyedSignal = QMetaMethod::fromSignal(&QObject::destroyed);
方法二
QString retVal;
QByteArray normalizedSignature = QMetaObject::normalizedSignature(“compute(QString, int, double)”);
int methodIndex = obj->metaObject()->indexOfMethod(normalizedSignature);
QMetaMethod method = obj->metaObject()->method(methodIndex);
method.invoke(obj,
Qt::DirectConnection,
Q_RETURN_ARG(QString, retVal),
Q_ARG(QString, “sqrt”),
Q_ARG(int, 42),
Q_ARG(double, 9.7));
其中,要使用QMetaObject::normalizedSignature()来规范化函数签名,确保方法签名是invoke()所期望的。
看到这里的时候,大家还是会很困惑,如何理解invoke()方法,使用该方法我们可以在任意的QObject对象上调用成员函数。
现在我来举一个例子:
在上一篇我的博文《Qt 控制台 使用connect连接信号和槽》中,已经提到了信号和槽的使用,
这里我们在main()中补充如下代码:
QByteArray normalizedSignature = QMetaObject::normalizedSignature("cirleSolve(int)");int methodIndex = obj.metaObject()->indexOfMethod(normalizedSignature);QMetaMethod metaMethod = obj.metaObject()->method(methodIndex);qDebug() << "Access: " << metaMethod.access();qDebug() << "Valid: " << metaMethod.isValid();qDebug() << "Index: " << metaMethod.methodIndex();qDebug() << "Signature: " << metaMethod.methodSignature();qDebug() << "Type: " << metaMethod.methodType();qDebug() << "Name: " << metaMethod.name();qDebug() << "Parameter names: " << metaMethod.parameterNames();qDebug() << "Parameter types: " << metaMethod.parameterTypes();qDebug() << "Return type: " << metaMethod.returnType();qDebug() << "Type name: " << metaMethod.typeName();//int result = 0;bool bCall = metaMethod.invoke(&obj, Qt:: AutoConnection,Q_ARG(int, 42));if(bCall){qDebug() << "the area of obj " << obj.getArea();}
输出:
可以看到,QMetaObject对象obj 获取到了槽函数的相关信息,并且通过invoke ()函数实现了对 槽函数circleSolve(int)的调用,将“”42”的值传入,并进行计算。
更多关于QMetaObject对象的介绍,可以参考官方的help手册。
QMetaMethod 获取成员函数的元信息相关推荐
- 获取成员函数地址及获取函数地址
首先我们定义一个类Ctest,类里面包含三个不同形式的成员函数,静态成员函数statFunc().动态成员函数dynFunc()和虚拟函数virtFunc().在main函数中我们利用cout标 ...
- 设计一个学校在册人员类(Person)。数据成员包括身份证号(IdPerson)、姓名(Name)、性别(Sex)、生日(Birth-day)和家庭住址(HomeAddress)。成员函数包括人员信息
在1设计一个学校在册人员类(Person).数据成员包括身份证号(IdPerson).姓名(Name).性别(Sex).生日(Birth-day)和家庭住址(HomeAddress).成员函数包括人员 ...
- 【Kotlin】扩展函数 ( 扩展函数声明 | 调用方式 | 与成员函数优先级 | 接收者空值处理 )
文章目录 I . 扩展函数 总结 II . 扩展函数概念简介 III . 扩展函数简单示例 IV . 扩展函数调用选择方式 : 静态解析 V . 扩展函数 调用优先级 VI . 扩展函数 接收者 空值 ...
- C++ 函数指针 类成员函数指针
一.函数指针 函数存放在内存的代码区域内,它们同样有地址.如果我们有一个int test(int a)的函数,那么,它的地址就是函数的名字,这一点如同数组一样,数组的名字就是数组的起始地址. 1.函数 ...
- 玩具or工具?普元信息低代码平台给出了说法
点击蓝字 关注云报 2021年7月20日,人类探索太空又迈出了具有里程碑意义的一步.蓝色起源公司研制的"新谢泼德号"飞船进入太空,而这艘飞船上的"乘客"既不是 ...
- 函数指针调用类的成员函数
1 在每个被调用函数之前加上static, 可以使成员函数脱离对象信息单独存在,虽然它属于这个类,但是没有附带上对象信息,但是前提是,static成员函数不能使用对象的信息(成员和函数). 2 使用一 ...
- 定义一个Book类,包括书名、书号、出版社、定价等数据成员,为其添加构造函数、修改书名、定价的set函数、获取书号的get函数,以及显示图书信息的showBook()成员函数。
在testBook.cpp中,创建一个mian函数,在mian函数中创建两个Book类型的对象,并对各对象初始化,调用showBook()成员函数输出各对象的信息,通过相应的set函数,修改各本书的名 ...
- 魔方APP项目-01-移动端开发相关概念、移动端自适配、元信息(meta)、开发准备、移动端项目搭建(模拟器调试)、APICloud(APICloud 前端框架,获取服务端API接口)
一.移动端开发相关概念 1.APP类型 ①.Native APP Native APP又称原生APP,就是我们平时说的手机应用软件. 原生APP 是针对IOS.Android.Windows等不同的手 ...
- R语言使用fs包的file_info函数查看文件元信息(属性信息)、使用file_chmod函数修改文件的权限、使用file_chown函数修改文件的所有者
R语言使用fs包的file_info函数查看文件元信息(属性信息).使用file_chmod函数修改文件的权限.使用file_chown函数修改文件的所有者 目录
最新文章
- 使用FluentValidation来进行数据有效性验证
- linux查域名对应的ip 系统调用,DDNS 的工作原理及其在 Linux 上的实现
- Tcode SCU3查看table log的error message - 如何查找necessary PFCG role
- arcengine,深入理解游标Cursors,实现数据的快速查找,插入,删除,更新
- python日历模块_Python日历模块| prmonth()方法与示例
- java settime_Java日历setTime()方法及示例
- 剑指offer(C++)-JZ36:二叉搜索树与双向链表(数据结构-树)
- ## normalize.css 中文版
- java rfid 写入_RFID读写器函数JAVA调用示例
- 达尔豪斯大学计算机科学世界排名,最新达尔豪斯大学世界排名抢先看 QS世界大学排名TOP300...
- Java 编程之美:并发编程基础晋级篇
- 《Level up》书评
- 精读Tree Energy Loss: Towards Sparsely Annotated Semantic Segmentation
- 一球成谜!咪咕直播联合即构打造世界杯直播答题新玩法
- (转载)互联网鄙视食物链大全
- 学习笔记——神经网络压缩
- java浏览器读取本地路径,怎么获取浏览器的文件下载路径
- MTK6833(天玑700平台)5G全网通_安卓智能核心板简介
- 暴风集团高管的薪酬累加约等于退市的暴风流通市值
- 软件著作权登记常见问题问答