在java语言中,可以使用getObject(String)函数,从类名直接构建新的对象。

而在C++中是没有这种机制的,Qt虽然提供了元对象机制,但只可以获取对象的类名,不能反向构建。

这个问题我在百度上找了很多,但都没有满意的答案,索性翻出去google一下,终于找到了解决方法。

原文地址:http://www.mimec.org/node/350

代码如下:

objectfactory.h
#include <QByteArray>
#include <QMetaObject>
#include <QHash> #ifndef OBJECTFACTORY_H
#define OBJECTFACTORY_H class ObjectFactory
{
public:
template<typename T>
static void registerClass()
{
constructors().insert( T::staticMetaObject.className(), &constructorHelper<T> );
} static QObject* createObject( const QByteArray& className, QObject* parent = NULL )
{
Constructor constructor = constructors().value( className );
if ( constructor == NULL )
return NULL;
return (*constructor)( parent );
} private:
typedef QObject* (*Constructor)( QObject* parent ); template<typename T>
static QObject* constructorHelper( QObject* parent )
{
return new T( parent );
} static QHash<QByteArray, Constructor>& constructors()
{
static QHash<QByteArray, Constructor> instance;
return instance;
}
}; #endif // OBJECTFACTORY_H

调用方法:

首先要注册你的class:(必须继承QObject并添加Q_OBJECT)

ObjectFactory::registerClass<MyObject>();

  

反射构建一个新对象:

MyObject* object = (MyObject*)ObjectFactory::createObject( "MyObject" );

作用:利用反射机制可以做很多事,例如,可以将反射与Qt的property相结合,实现hibernate框架(有空会再写一篇博客介绍)。

不足:这种实现方法不可避免地需要“先注册,后使用”,还达不到真正的反射,虽然可以在一个启动函数中注册所有的类,但还是比较麻烦的。

转载请标明出处:http://www.cnblogs.com/ztzheng/p/4122975.html

Qt根据类名创建对象(元对象反射)的更多相关文章

  1. Qt笔记-const-虚函数-元对象系统

    const与指针 摘自C++ Primer Plus (第五版) 中文版 const(常量): const变量的地址可以给指向const的指针,但不能指向常规类型的指针: const float a= ...

  2. Qt元对象(Meta-Object)系统与反射

    反射 -在计算机科学中,反射是指计算机程序在运行时(Run time)可以访问.检测和修改它本身状态或行为的一种能力.[1]用比喻来说,反射就是程序在运行的时候能够“观察”并且修改自己的行为. 要注意 ...

  3. qt study 元对象,属性和反射编程

    所谓反射,就是指对象成员的自我检查,使用反射编程(reflective programming),就可以编写出通用的操作,可以对具有不同结构的类进行操作. QMetaObject 元对象模式,描述一个 ...

  4. 深入了解Qt(二)之元对象系统(Meta-Object System)

    深入了解Qt主要内容来源于Inside Qt系列,本文做了部分删改,以便于理解.在此向原作者表示感谢! 在Qt Meta Object System-元对象系统这篇文章中,从底层实现的源码剖析了元对象 ...

  5. Qt元对象系统简介

    在Qt中提供了c++的扩展,提供了一种元对象系统的机制,(meta-object-system)的机制.其中包含了信号与槽的内部机制,能够访问到QObject子类的元对象信息的功能. Q_OBJECT ...

  6. Qt对象模型之二:对象树与元对象系统

    一.对象树的概念 Qt中使用对象树(object tree)来组织和管理所有的QObject类及其子类的对象.当创建一个QObject时,如果使用了其他的对象作为其父对象(parent),那么这个 Q ...

  7. 解析Qt元对象系统(四) 属性系统(确实比较方便)

    官方解释 我们在Qt源码中可以看到一个QObject的子类经常会用到一些Q_开头的宏,例如QMainWindow类开始部分代码是这样的: Q_PROPERTY(QSize iconSize READ ...

  8. Qt信号槽机制的实现(面试的感悟,猜测每一个类保存的一个信号和槽的二维表,实际使用函数指针 元对象 还有类型安全的检查设定等等)

    因为面试时问了我这道题,导致我想去了解信号槽到底是如何实现的,于是贴着顺序看了下源码,大致了解了整个框架.网上关于信号槽的文章也很多,但是大部分都是将如何应用的,这里我就写一下我所理解的如何实现吧, ...

  9. QtCore是Qt的精髓(包括五大模块:元对象系统,属性系统,对象模型,对象树,信号槽)

    作者:小豆君的干货铺链接:https://www.zhihu.com/question/27040542/answer/218384474来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业 ...

随机推荐

  1. dwz笔记之tree权限扩展

    碰到的问题:tree选择子节点时,父级节点的值没有选择 解决方法如下(红色部分): 原代码: _checkParent:function(){ if($(this).parent().hasClass ...

  2. 使用ToolRunner运行Hadoop程序基本原理分析

    为了简化命令行方式运行作业,Hadoop自带了一些辅助类.GenericOptionsParser是一个类,用来解释常用的Hadoop命令行选项,并根据需要,为Configuration对象设置相应的 ...

  3. phpwind 去除init.phpwind.net统计功能

    修改的文件如下:global.phplib/staticpage.class.phprequire/template.phpsimple/index.php

  4. cocos2d-js 入门一 ([isNaN()和isFinite(),字符和Number之间的转化)

    isNaN() : 用于检查其参数是否是非数字值.// 提示:是非数字哦.(not a number)document.write(isNaN(0) )  //返回falsedocument.writ ...

  5. Xcode把应用程序打包成ipa

    Xcode把应用程序打包成ipa 分类: App Store2012-11-20 15:47 11722人阅读 评论(0) 收藏 举报 Xcode教程 Xcode4发布测试 打包Archive操作是本 ...

  6. SGU 194 Reactor Cooling

    http://acm.sgu.ru/problem.php?contest=0&problem=194 题意:m条有向边,有上下界,求最大流. 思路:原图中有u-v low[i],high[i ...

  7. 【BBST 之伸展树 (Splay Tree)】

    最近“hiho一下”出了平衡树专题,这周的Splay一直出现RE,应该删除操作指针没处理好,还没找出原因. 不过其他操作运行正常,尝试用它写了一道之前用set做的平衡树的题http://codefor ...

  8. javascript运算符整理

    说起运算符,基本上各类编程语言中都会涉及,使用方法大同小异.今天在这里以javascript做简单的整理. 总得来说运算符还是比较的多,大致可以分为以下几种类型: 一元运算符 位运算符 布尔运算符 乘 ...

  9. Console 程序在任务计划程序无法读写文件

    当我们把Console 程序作为Window计划任务的计划任务的操作的时候,我们明明设置了程序的执行权限或者文件夹的读写权限(尝试了所有权限,各种账号读写权限的切换都不好使),但是当我们有读写操作的时 ...

  10. pyqt QTableWidgetItem多行显示

    def __2(self): t1=QtGui.QTableWidgetItem(self.names.text()) self.tabs.tableinsertinto.setItem(0,0,t1 ...