基于Qt的反射必须继承自QObject并使用Q_OBJECT宏吗?
本文给出的实现方式无需继承,只需要Q_GADGET宏即可。
ObjectFactory.hpp
#ifndef OBJECTFACTORY_H
#define OBJECTFACTORY_H
#include <QObject>
#include <QByteArray>
#include <QMetaObject>
#include <QHash>
class ObjBase
{
Q_GADGET
public:
virtual ~ObjBase() {}
};
class ObjectFactory
{
public:
template<typename T>
static void registerClass()
{
//QString name = T::staticMetaObject.className();
constructors().insert( T::staticMetaObject.className(), &constructorHelper<T> );
}
static ObjBase* createObject( const QByteArray& className, ObjBase* parent = NULL )
{
Constructor constructor = constructors().value( className );
if ( constructor == NULL )
return NULL;
return (*constructor)( parent );
}
private:
typedef ObjBase* (*Constructor)(ObjBase* parent );
template<typename T>
static ObjBase* constructorHelper(ObjBase* parent )
{
return new T( parent );
}
static QHash<QByteArray, Constructor>& constructors()
{
static QHash<QByteArray, Constructor> instance;
return instance;
}
};
class TestObject : public ObjBase
{
Q_GADGET
public:
TestObject(ObjBase* parent = nullptr) {}
void setText(const QString& text)
{
m_text = text;
}
QString text() const { return m_text; }
private:
QString m_text;
};
#endif // OBJECTFACTORY_H
main.cpp
#include "ObjectFactory.hpp"
#include <QDebug>
int main()
{
ObjectFactory fac;
fac.registerClass<TestObject>();
qDebug()<<"begin-------------------------------";
TestObject* object = dynamic_cast<TestObject*>(fac.createObject( "TestObject" ));
object->setText("template factory");
qDebug()<<object->text();
}
样例
https://gitee.com/beibeix/qt-samples/tree/master/QtReflection