利用Qt的反射机制获取编写的类的相关信息(类成员函数个数,类型,名字等,有实例代码)
最近研究了一下QT的反射机制,
Qt的元对象系统除了提供信号/槽机制的特性之外,它还提供了以下特性:
QObject::metaObject()
返回关联的元对象
QMetaObject::className()
在运行时状态下返回类名
QObject::inherits()
判断类的继承关系
QObject::tr(),QObject::trUtf8()
提供国际化,翻译字符串
QObject::setProperty(),QObject::property()
通过名称来动态设置和获取属性
QMetaObject::newInstance()
创建新实例
通过QObject::metaObject()方法, 所有继承于QObject的类可以 返回元对象系统为其生成的metaObject对象。QMetaObject提供的一些重要信息:
QMetaClassInfo
通过宏Q_CLASSINFO的支持,提供类的附加信息
QMetaEnum
Qt特色的枚举对象,支持key和 value之间的互转
QMetaMethod
提供类成员函数的元数据
QMetaProperty
提供类成员属性的元数据
Qt反射前期准备
1、首先得继承于Q_Object,同时需要在class中加入Q_OBJECT。
2、注册类成员变量需要使用Q_PROPERTY
Q_PROPERTY( type member READ get WRITE set) 其中READ,WRITE是关键字
Type表示成员的类型(不支持自定义类型,对Qt很多基本类型都支持);
Member代表你给该成员另外起的名字,可以和变量名不同;get,set就是自己在C++函数里面定义的基本的访问函数名,不需要写参数。
3、注册类成员函数
如果你希望这个函数能够被反射,那么很简单,只需要在类的函数声明前加入Q_INVOKABLE关键字。
参考文章:
https://blog.csdn.net/playstudy/article/details/7861329
https://www.cnblogs.com/RainyBear/p/5251440.html
下面是我自己编写的实例:
1.右击QT Creater中的项目名——添加新文件——选择C++ Class——Choose——取个Class name:TestClass——Base Class选择QObject——点击下一步——在项目文件列表中会增加一个testclass.h和testclass.cpp
testclass.h中如下:
#ifndef TESTCLASS_H
#define TESTCLASS_H
#include
class TestClass : public QObject
{
Q_OBJECT
public:
explicit TestClass(QObject *parent = 0);
Q_INVOKABLE int sum(int na,int nb);
Q_INVOKABLE int decrease(int na, int nb);
signals:
public slots:
};
#endif // TESTCLASS_H
【利用Qt的反射机制获取编写的类的相关信息(类成员函数个数,类型,名字等,有实例代码)】testclass.cpp中如下:
#include "testclass.h"
TestClass::TestClass(QObject *parent) : QObject(parent)
{}
int TestClass::sum(int na,int nb)
{
return na+nb;
}
int TestClass::decrease(int na, int nb)
{
return na-nb;
}
在主界面的cpp中添加一个按钮响应函数,如下:
注:在主界面.cpp中要包含TestClass的头文件#include “testClass.h”
void MainWindow::on_ShowClassInfo_clicked()
{
TestClass classTestClass;
const QMetaObject *theMetaObject = classTestClass.metaObject();
//定义一个QMetaObject对象指针,用来获取类classTestClass的相关信息
int nMetathodCount = theMetaObject->methodCount();
for(int nMetathodIndex = 0;
nMetathodIndex < nMetathodCount;
nMetathodIndex++)
{
QMetaMethod oneMethod = theMetaObject->method(nMetathodIndex);
qDebug() <<"MethodName: " <
文章图片
程序运行后,点击ShowClassInfo按钮,在“应用程序输出”界面会显示如下信息:
MethodName:"destroyed"
parameterNames:("")
parameterTypes ("QObject*")
typeName:void
signature:1
methodType:1 MethodName:"destroyed"
parameterNames:()
parameterTypes ()
typeName:void
signature:1
methodType:1 MethodName:"objectNameChanged"
parameterNames:("objectName")
parameterTypes ("QString")
typeName:void
signature:1
methodType:1 MethodName:"deleteLater"
parameterNames:()
parameterTypes ()
typeName:void
signature:1
methodType:2 MethodName:"_q_reregisterTimers"
parameterNames:("")
parameterTypes ("void*")
typeName:void
signature:1
methodType:2 MethodName:"sum"
parameterNames:("na", "nb")
parameterTypes ("int", "int")
typeName:int
signature:1
methodType:0 MethodName:"decrease"
parameterNames:("na", "nb")
parameterTypes ("int", "int")
typeName:int
signature:1
methodType:0
可以看到,TestClass实例化的类变量classTestClass的QMetaObject遍历出来的QMetaMethod一共有7个,其中除了我们手动添加的int sum(int na,int nb); 和int decrease(int na, int nb); 之外,还有5个自动生成的隐藏的QMetaMethod。
推荐阅读
- 热闹中的孤独
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 一个人的旅行,三亚
- 布丽吉特,人生绝对的赢家
- 慢慢的美丽
- 尽力
- 一个小故事,我的思考。
- 家乡的那条小河
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量