概述
首先说一下什么是反射:
反射是指程序在运行时动态获取对象属性与方法的一种机制,即编译器需要将类型信息(属性类型与偏移地址以及成员函数的地址等信息)编译到程序文件中,当程序运行时将这些信息加载到内存中去,做到运行时只根据对象的地址或引用就可以获取到对象的类型信息,从而利用这些信息达到修改或重建对象的目标。
再简单一点说,就是可以通过类名称来创建一个类对象,这在Java和Object-C中是原生支持的,所以实现起来非常简单,但是C++就不支持了,如果想要用到反射机制,那就得自己实现。
利用qt元对象方式的反射机制。
第一,需要注册自定义类。 这里利用 #define RegisterClassFactory(className)
static int className##_id = qRegisterMetaType<className*>(); 宏定义进行。
第二,自定义类必须是继承于QObject基类,并且自定义类构造函数必须加上 Q_INVOKABLE 关键字。
baseclass.h 如下:
#pragma once
#include <QObject>
#include <QDebug>
#define RegisterClassFactory(className) \
static int className##_id = qRegisterMetaType<className*>();
class BaseClass : public QObject
{
Q_OBJECT
public:
explicit BaseClass(QObject *parent = nullptr);
virtual void doSomething() {
qDebug() << "baseclass doing something"; }
protected:
int m_number;
signals:
};
baseclass.cpp 如下: