Inside Qt Series (五):元对象系统(Meta-Object System
2010-11-26 15:04:21
分类: LINUX
作者:Q-Kevin @ http://www. 从本节开始,我们讲解 Qt Meta-Object System 的功能,以及实现。 在使用 Qt 开发的过程中,大量的使用了 signal 和 slot. 比如,响应一个 button 的 click 事件,我们一般都写如下的代码: class MyWindow : public QWidget private slots: void MyWindow:: slotStartClicked() 在这段代码中,我们把 btnStart 这个 button 的clicked() 信号和 MyWindow 的 slotStartClicked() 这个槽相连接,当 btnStart 这个 button 被用户按下(click)的时候,就会发出一个 clicked() 的信号,然后,MyWindow:: slotStartClicked() 这个 slot 函数就会被调用用来响应 button 的 click 事件。 这段代码是最为典型的 signal/slot 的应用实例,在实际的工作过程中,signal/slot 还有更为广泛的应用。准确的说,signal/slot 是QT提供的一种在对象间进行通讯的技术,那么,这个技术在QT 中是如何实现的呢? 这就是 Qt 中的元对象系统(Meta Object System)的作用,为了更好的理解它,让我先来对它的功能做一个回顾,让我们一起来揭开它神秘的面纱。 Meta-Object System 的基本功能 Meta Object System 的设计基于以下几个基础设施: * QObject 类 除了提供在对象间进行通讯的机制外,元对象系统还包含以下几种功能: * QObject::metaObject() 方法 除了以上这些功能外,它还使用qobject_cast()方法在QObject类之间提供动态转换,qobject_cast()方法的功能类似于标准 C++的dynamic_cast(),但是qobject_cast()不需要RTTI的支持,在一个QObject类或者它的派生类中,我们可以不定 义Q_OBJECT宏。如果我们在一个类中没有定义Q_OBJECT宏,那么在这里所提到的相应的功能在这个类中也不能使用,从meta-object的 观点来说,一个没有定义Q_OBJECT宏的类与它最接近的那个祖先类是相同的,那就是所,QMetaObject::className() 方法所返回的名字并不是这个类的名字,而是与它最接近的那个祖先类的名字。所以,我们强烈建议,任何从QObject继承出来的类都定义Q_OBJECT 宏。 下一节,我们来了解另一个重要的工具:Meta-Object Compiler
====================================================================== 《Inside Qt Series》专栏文章总索引: http://www./qt |
|