导言:

最近在深入理解一个项目的Demo时,有一个难点困惑了整整一个上午,就是关于QMetaMethod类的使用。查看了官方的手册,懵懵懂懂。搜罗了网上的相关介绍,总算是有些明白了。接着,我就来分享下我的总结吧!

介绍:
QMetaMethod类是用来获取成员方法的元信息的一个类。

通过该类,我们可以获取到一个成员方法的类型,比如它是信号、槽、方法、构造函数;
也可以获得方法的完整签名,以及方法所接受的参数类型和参数名字;
当然也可以获取方法的返回值类型;
还可以使用access()方法获取成员函数的访问权限。
当然,最重要的还是invoke()方法,使用该方法我们可以在任意的QObject对象上调用成员函数。

而要得到一个QMetaMethod类的实例,有如下方法:

  1. 对于信号,可以使用该类的静态方法fromSignal()来获得相对于该信号的QMetaMethod对象;
  2. 对于普通成员函数和槽函数,可以使用类的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 获取成员函数的元信息相关推荐

  1. 获取成员函数地址及获取函数地址

     首先我们定义一个类Ctest,类里面包含三个不同形式的成员函数,静态成员函数statFunc().动态成员函数dynFunc()和虚拟函数virtFunc().在main函数中我们利用cout标 ...

  2. 设计一个学校在册人员类(Person)。数据成员包括身份证号(IdPerson)、姓名(Name)、性别(Sex)、生日(Birth-day)和家庭住址(HomeAddress)。成员函数包括人员信息

    在1设计一个学校在册人员类(Person).数据成员包括身份证号(IdPerson).姓名(Name).性别(Sex).生日(Birth-day)和家庭住址(HomeAddress).成员函数包括人员 ...

  3. 【Kotlin】扩展函数 ( 扩展函数声明 | 调用方式 | 与成员函数优先级 | 接收者空值处理 )

    文章目录 I . 扩展函数 总结 II . 扩展函数概念简介 III . 扩展函数简单示例 IV . 扩展函数调用选择方式 : 静态解析 V . 扩展函数 调用优先级 VI . 扩展函数 接收者 空值 ...

  4. C++ 函数指针 类成员函数指针

    一.函数指针 函数存放在内存的代码区域内,它们同样有地址.如果我们有一个int test(int a)的函数,那么,它的地址就是函数的名字,这一点如同数组一样,数组的名字就是数组的起始地址. 1.函数 ...

  5. 玩具or工具?普元信息低代码平台给出了说法

    点击蓝字  关注云报 2021年7月20日,人类探索太空又迈出了具有里程碑意义的一步.蓝色起源公司研制的"新谢泼德号"飞船进入太空,而这艘飞船上的"乘客"既不是 ...

  6. 函数指针调用类的成员函数

    1 在每个被调用函数之前加上static, 可以使成员函数脱离对象信息单独存在,虽然它属于这个类,但是没有附带上对象信息,但是前提是,static成员函数不能使用对象的信息(成员和函数). 2 使用一 ...

  7. 定义一个Book类,包括书名、书号、出版社、定价等数据成员,为其添加构造函数、修改书名、定价的set函数、获取书号的get函数,以及显示图书信息的showBook()成员函数。

    在testBook.cpp中,创建一个mian函数,在mian函数中创建两个Book类型的对象,并对各对象初始化,调用showBook()成员函数输出各对象的信息,通过相应的set函数,修改各本书的名 ...

  8. 魔方APP项目-01-移动端开发相关概念、移动端自适配、元信息(meta)、开发准备、移动端项目搭建(模拟器调试)、APICloud(APICloud 前端框架,获取服务端API接口)

    一.移动端开发相关概念 1.APP类型 ①.Native APP Native APP又称原生APP,就是我们平时说的手机应用软件. 原生APP 是针对IOS.Android.Windows等不同的手 ...

  9. R语言使用fs包的file_info函数查看文件元信息(属性信息)、使用file_chmod函数修改文件的权限、使用file_chown函数修改文件的所有者

    R语言使用fs包的file_info函数查看文件元信息(属性信息).使用file_chmod函数修改文件的权限.使用file_chown函数修改文件的所有者 目录

最新文章

  1. 使用FluentValidation来进行数据有效性验证
  2. linux查域名对应的ip 系统调用,DDNS 的工作原理及其在 Linux 上的实现
  3. Tcode SCU3查看table log的error message - 如何查找necessary PFCG role
  4. arcengine,深入理解游标Cursors,实现数据的快速查找,插入,删除,更新
  5. python日历模块_Python日历模块| prmonth()方法与示例
  6. java settime_Java日历setTime()方法及示例
  7. 剑指offer(C++)-JZ36:二叉搜索树与双向链表(数据结构-树)
  8. ## normalize.css 中文版
  9. java rfid 写入_RFID读写器函数JAVA调用示例
  10. 达尔豪斯大学计算机科学世界排名,最新达尔豪斯大学世界排名抢先看 QS世界大学排名TOP300...
  11. Java 编程之美:并发编程基础晋级篇
  12. 《Level up》书评
  13. 精读Tree Energy Loss: Towards Sparsely Annotated Semantic Segmentation
  14. 一球成谜!咪咕直播联合即构打造世界杯直播答题新玩法
  15. (转载)互联网鄙视食物链大全
  16. 学习笔记——神经网络压缩
  17. java浏览器读取本地路径,怎么获取浏览器的文件下载路径
  18. MTK6833(天玑700平台)5G全网通_安卓智能核心板简介
  19. 暴风集团高管的薪酬累加约等于退市的暴风流通市值
  20. 软件著作权登记常见问题问答

热门文章

  1. typedef的用法
  2. C++学习笔记之——引用 内联函数
  3. 九月免费手账分享-【奶油星云】
  4. 科大星云诗社动态20210131
  5. 科大星云诗社动态20210415
  6. mssql 计划怎每隔n秒_前端:调你一个接口6秒还配资深工程师?后端:有24部分需要处理!...
  7. 关于h5py的使用及数据封装实例
  8. 一次二次开发中的经验与教训(一)
  9. 软件开发中的一些感想
  10. 在整个数据库中查找包含某关键字的所有存储过程