我爱编程

C++中使用QT实现反射机制

2018-06-11  本文已影响28人  氕氘氚0921

1.反射机制

反射机制在java中是一个非常重要的特性,JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。C++本身是不支持反射机制的。

2.研究背景

由于工作中经常使用到通过if...else...来进行判断走到哪个函数内,会在代码中也一大堆的if...else...非常难看,而且不好维护,因此就想能不能试着实现一下JAVA的反射机制。
一开始想到用函数指针,通过map来保存映射关系,写一个工厂模式的类。用过字符串也就是函数名来进行注册,之后这个工厂可以根据函数名来找不同的函数。
后来无意间发现QT本身就有实现过反射机制,因此决定直接使用QT的反射机制来完成。

3.具体实现

首先要实现QT的反射机制,必须这个类是继承自QObject的类,因为QT在QObject中做了很多封装,使C++能够像JAVA一样写。
其次要在该类中需要做反射的那个函数前写一个宏Q_INVOKABLE,用于声明。
具体例子如下所示:

class Test: public QObject
{
    Q_OBJECT
public:
    Test();
    ~Test();
    Q_INVOKABLE void func1();
};

在使用的时候也非常的方便,使用QMetaObject::invokeMethod方法即可。具体例子如下所示:

void main(int argc, char *argv)
{
    QCoreApplication app(argc, argv);
    Test test;
    QMetaObject::invokeMethod(test, "func1");
    app.exec();
}

这样就可以调用到func1()的方法了。

4.其他操作

有些函数需要使用返回值,入参出参等,以及多线程异步操作等。可以参看QT的帮助手册。

上一篇下一篇

猜你喜欢

热点阅读