Qt反射机制实现,通过类名创建对象
版权声明:本文为知乎作者「Qt开发编程」的原创文章,转载请附上原文出处链接及本声明。
概述
反射的作用
-
获取类型的信息,包括属性、方法 -
动态调用方法 -
动态构造对象 -
从程序集中获得类型
反射的缺点
反射的使用场景
如何实现
template<typename L> //用于反射传父类参数
class CReflectClass
{
public:
//首先要注册创建的类
template<typename T>
static void registerClass()
{
//&constructorHelper<T>其实是获取创建的函数指针,核心功能。
constructors().insert(T::staticMetaObject.className(), &constructorHelper<T>);
}
static QObject *createObject(const QByteArray& className,L* parent = nullptr)
{
Constructor constructor = constructors().value(className);
if (constructor == nullptr ){
return nullptr;
}
return (*constructor)(parent);//执行new T函数,创建对应实例
}
private:
typedef QObject *(*Constructor)(L* parent);
template<typename T>
static QObject *constructorHelper(L* parent)
{
if(parent)
return new T(parent);
else {
return new T();
}
}
static QHash<QByteArray, Constructor> &constructors()
{
static QHash<QByteArray, Constructor> instance;
return instance;
}
};
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//注册类
CReflectClass<Widget>::registerClass<ClassA>();
CReflectClass<Widget>::registerClass<ClassB>();
//创建对象
auto a = static_cast<ClassA*>(CReflectClass<Widget>::createObject("ClassA",this));
a->test();
auto b = CReflectClass<Widget>::createObject("ClassB",this);
}
Widget::~Widget()
{
delete ui;
}
ClassB::ClassB(QObject *parent):
QObject(parent)
{
qDebug() << __FUNCTION__ ;
}
ClassA::ClassA(QObject *parent):
QObject(parent) {
qDebug() << __FUNCTION__ ;
}
void ClassA::test()
{
qDebug() << __FUNCTION__;
}
深圳市优飞迪科技有限公司成立于2010年,是一家专注于产品开发平台解决方案与物联网技术开发的国家级高新技术企业。
十多年来,优飞迪科技在数字孪生、工业软件尤其仿真技术、物联网技术开发等领域积累了丰富的经验,并在这些领域拥有数十项独立自主的知识产权。同时,优飞迪科技也与国际和国内的主要头部工业软件厂商建立了战略合作关系,能够为客户提供完整的产品开发平台解决方案。
优飞迪科技技术团队实力雄厚,主要成员均来自于国内外顶尖学府、并在相关领域有丰富的工作经验,能为客户提供“全心U+端到端服务”。
点赞 评论 收藏