分享

基于Qt元对象反射机制的研究与应用

 quasiceo 2013-02-22
0引言 基于Qt元对象反射机制的研究与应用★ 王家华 .孙楷 (西安石油大学计算机学院,西安710065) 摘要:反射是提高程序的灵活性和可扩展性至关重要的技术.它使得软件系统具有自适应能力, 实现程序的动态演进。阐述Qt通过MOC实现的反射机制的原理和工作过程,并通过应 用实例说明Qt反射机制的强大功能并展示其应用。 关键词:Qt;元对象:反射机制 反射(Reflection)的概念足由Smith在1982年首次 提出的.主要是指程序町以访问、检测和修改它本身状 态或行为的一种能力fl】。这一概念的提出很快引发了计 算机科学领域关于应川反射性的研究。反射技术被认 为足动态语言的一个非常重要的特性.它允许动态发 现和绑定类、方法、字段,以及所有其他的由此所产生 的元素。也就是说.通过采用某种机制来实现对自己行 为的描述和监测.并能根据自身行为的状态和结果.调 整或修改应用所描述行为的状态和相关的语义。当前 主流的计算反射原型系统大多是建立在元对象协议. Qt也是基于这种体系结构,如图1。通过元对象编译器 (MOC)针对需要的类生成代码来支持这种机制。 Qt的核心机制信号和槽机制是一种高级接口。它 是由Qt自行定义的、应用于对象之间的通信机制.是 Qt的核心特性,也是Qt区别于其他工具包的重要地 方。它独立于标准的C,C++语言。要正确地处理信号和 槽.必须借助一个称为MOC(Meta Object Compiler)的 Qt工具,该T具是一个C++预处理程序,它为高层次的 事件处理自动生成所需要的附加代码。本文主要研究 的是通过QMetaobject类、QMetaPmperty类实现类似 C#的反射编程.动态获得一个继承Q0bject对象所拥 有的性质和方法的相关信息。 图1 Qt MOC体系结构 1OMetaObject中i!|勺MetaObject模式 通过对抽象数据类型本身进行抽象就可以获得元 对象.所谓的元对象就是描述另外一个对象结构的一 个对象。QMetaobject是Metaobjeet模式的一种Qt实 现.只要满足下面3个条件:(1)每个类必须在一个头 文件中进行定义;(2)需要实现反射编程的类必须继承 Q0bject类;(3)类中的定义必须包括Q_Objeet宏。元 ★基金项目:国家自然科学基金项目(No.50474042) 收稿日期:2010-08—31 修稿日期:2010—09-30 作者简介:王家华(1945一),男,教授,从事领域为油藏描述、储层建模、地质统计学、地质图形可视化、决策分析、风险分析等方法及 其软件系统 现代计算机2010.10 o 万方数据 \\、 竺三竺 对象编译器(MOC)都会为其生成QMetaObject对象。 QMetaObject元对象拥有此对象的性质和方法的相关 信息.负责信号和槽对象问的通信机制以及运行时类 型信息等。通过调用QObjeet的一个成员函数,就可以 返同指向QMetaObject的指针.同时可以使用 QMetaObject激活反射函数。例如:QMetaObject::class. Name()返同类的名字,QMetaObject::superClass()返回 基类指针.如果不存在则返回空指针。 对于类的成员,可以通过QMetaObject::propertv (int index)返回QMetaProperty对象,通过对象 QMetaProperty激活属性一些函数。例如:QMetaProp. erty::name()返回属性的名字,QMetaPmperty::type()返 回属性的类型等信息。对于类中的成员函数.可以通过 MetaObiect::melhod(int index)返回QMetaMethod对象, 通过QMetaMethod对象激活方法的一系列函数。例如: const char木QMetaMethod=signature()返回方法的签名. QList<QByteArray>QMetaMethod::parameterNames()返 回方法参数名字.MethodType QMetaMethod::method— Type()返回方法的类型,类型有信号函数、槽函数、普 通函数。QMetaObjeet::invokeMethod()可以根据给定的 名字激活类的成员函数。 2应用实例 (1)定义可以使用MOC元对象反射机制的类。具体 方法参照按照以下。 Class TestClass:public QObject//继承QObject元对象 {Q-0BJECT//预定义宏,使用MOC必须在类的定义中 Q_PROPERTY(QString id READ getId WRITE setld);// MOC识别的属性设置 Q_PROPERTY(QString name READ getName WRITE setName):,,MOC识别的属性设置 public slots:void id changed—slot(QString);,/槽函数, 修饰符为Drivate或者protectd signals:void id_changed_signal(QString);//信号函数 public: void setId(const QString&newId)l m_id=newId;l,,普 通函数 QString getId()const{return m_id;l,,普通函数 void setName(const QString&newName){m nalne=Hew— Name;l,,普通函数 QString getName()cons|I remm m_name;},,普通函数 private: o现代计算机2010.10 QString m_id;/,j既有成员变量 QString m_xmme;//私有成员变量 】; (2)调用反射 QSmngList methodName(QObject}obj)//返回一个元对象 的函数签名 {const QMetaObject*metaObject=obj一>metaObject();//获 得元对象 QStringList methods; for(int i=metaObject一>methodOffset();i<metaObjeet-> methodCount();++i) lmethods<<QString::frond.atinI(metaObject->method(i). signature());} }QStfingLst methodName(QObject堆obi)//返回一个元对象 的属性名字 {const QMemO啦t*metaObject=obj->memObject()∥获 得元对象 QStringList properties; for(int i=metaObject->propertyOffset();i<metaObject一> pmpertyCount();+“) properties<<QString::fromLatinI(metaObject一>property (i).name()); }3结语 ot是一个跨平台的C++GUI应用构架,它提供了 丰富的窗口部件集,具有面向对象、易于扩展、真上E的组 件编程等特点.得到了越来越多用户的认可。作为反射 机制,同样是Ot的一种强大功能,它能够创建灵活的代 码.这些代码可以在运行时装配,虽然只是实现简单的 静态反射.但只要能理解并熟练掌握反射机制,就可以 将其应用到应用程序中.就可以使程序更加专业化,而 且可以节省很多的代码.大大减轻编码的工作量。 参考文献 【1】尹松强,傅鹂.Java反射机制探究阴.软件导刊,2008(11) f2】龙天威,陈亚楠。陈彪.浅谈Java反射机制【J】.华南金融电 脑,2008(12) 【3】唐姗,赵文耘.基于反射的动态软件体系结构实现叨.微电 子学与计算机。2006(09) 『41李青山,陈平,毛伟.一种基于反射和开放编译的C++植入 机制【J】.系统T程与电子技术,2003(07) 【5】(加拿大)Gasmin Blanchette、(英)Mark Summerfield著.C++ GUl Programming with Qt4[M].Publisher:.Prentice Hall,2006 (下转第17页) 万方数据 !竺 二// —————’——。’————’‘。。。。‘。————’—‘————————————‘’———————————? —’_———? ______--‘_-__————-————-————,————————--__—————_——-——————__————I__ ——————————————一一一 /【11周洋,蒋吕俊,方钰.异构环境下独立任务调度算法的研究. 计算机科学忉,2008,35(8):90.97 【2l郭创,余谅.网格任务调度算法的研究.计算机技术与发展 【J】,2009,19(6):5—8 f3]蔡红云,田俊峰,何欣枫。张建勋.网格计算中一种改进的 启发式任务调度算法.计算机研究与发展叨,2006,43(Sup-- p1.):52—55 【4】郭立文,杨扬,郭文彩.一种基于QoS的网格服务调度模型 fJl.计算机应用与软件,2006(9):54~57 【5】罗宇平.基于Min—Min改进后的网格调度算法.微电子学 与计算机【J】,2009,26(3):86~88 【61薛庆吉,李春艳.一个改进的Min—rain网格调度任务算法. 武汉理工大学学报【J】,2009,31(3):379~381 AGrid Tasks Scheduling Algorithm Based on Load Balance UQiao—ling .MIN Lian-ying (Department of Computer and Science,Wuhan University of Technology,Wuhan 430063) Abstract:In酣d computing,a good algorithm for tasks scheduling should not only decrease the makespan of all tasks but also balance the load among the resources in the#rd system.De. scribes and analyzes the theories of three typical algorithm in details.According to tlle ad. vances and disadvances of these typical algorithm,proposes an improved algorithm,which suits to be used in the加d environment. Keywords:Gird Computing;Tasks Scheduling;I.oad Balance;Makespan ,V、一、一、一、——、,、-一、,、—、,、一、—,、,、,、,、,、,、,、 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ (上接第4页) Research and Application of Qt Meta Object Reflection Machan ism WANG Jia—hua ,SUN Kai (Department of ComputerXi'an Shiyou University,XYan 710065) Abstract:Reflection is avital technology in improving protgram"s flexiblity and expansibility,it makes the software system adaptive,realizes the dynamic evolution of program.Describes the principle of reflection maehanism and operation process of qt via MOC,illustrates the power of reflection machanism by application and shows its application. Keywords:Qt;Meta Object;Reflection Mechanism 现代计算机2010.10 @ 万方数据

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多