Inside Qt Series (八):Meta Object Class overview

作者:Q-Kevin @ http://www.qkevin.com

前面我们介绍了 Meta Object 的基本功能,和它支持的最重要的特性之一:Signal & Slot的基本功能。现在让我们来进入 Meta Object 的内部,看看它是如何支持这些能力的。

    Meta Object 的所有数据和方法都封装在一个叫QMetaObject 的类中。它包含并且可以查询一个Qt类的 meta 信息,meta信息包含以下几种:
     * 信号表(signal table),其中有这个对应的 Qt 类的所有Signal的名字
     * 槽表(slot table),其中有这个对应的Qt类中的所有Slot的名字。
     * 类信息表(class info table),包含这个Qt类的类型信息
     * 属性表(property table),其中有这个对应的Qt类中的所有属性的名字。
     * 指向parent meta object的指针(pointers to parent meta object)

请参考下图, Qt Meta Data Tables:

QMetaOb ject 对象与 Qt 类之间的关系:

    * 每一个 QMetaObject 对象包含了与之相对应的一个 Qt 类的元信息
    * 每一个 Qt 类(QObject 以及它的派生类) 都有一个与之相关联的静态的(static) QMetaObject 对象(注:class的定义中必须有 Q_OBJECT 宏,否则就没有这个Meta Object)
    * 每一个 QMetaObject 对象保存了与它相对应的 Qt 类的父类的 QMetaObject 对象的指针。   或者,我们可以这样说:“每一个QMetaObject对象都保存了一个其父亲(parent)的指针”.注意:严格来说,这种说法是不正确的,最起码是不严谨的。

请参考下图,Qt Meta Class 与 Qt class 之间的对应关系:

Q_OBJECT宏

Meta Object 的功能实现,这个宏立下了汗马功劳。首先,让我们来看看这个宏是如何定义的:

#define Q_OBJECT \
public: \
     Q_OBJECT_CHECK \
     static const QMetaObject staticMetaObject; \
     virtual const QMetaObject *metaObject() const; \
     virtual void *qt_metacast(const char *); \
     QT_TR_FUNCTIONS \
     virtual int qt_metacall(QMetaObject::Call, int, void **); \
private:

这里,我们先忽略Q_OBJECT_CHECK 和QT_TR_FUNCTIONS 这两个宏。

我们看到,首先定义了一个静态类型的类变量staticMetaObject,然后有一个获取这个对象指针的方法metaObject()。这里最重要的就是类变量staticMetaObject 的定义。这说明所有的 QObject 的对象都会共享这一个staticMetaObject 类变量,靠它来完成所有信号和槽的功能,所以我们就有必要来仔细的看看它是怎么回事了。

======================================================================
声明:
《Inside Qt Series》专栏文章是(http://www.qkevin.com)原创技术文章。
本系列专栏文章可随意转载,但必须保留本段声明和每一篇文章的原始地址。
作者保留版权,未经作者同意,不得用于任何商业用途

《Inside Qt Series》专栏文章总索引: http://www.qkevin.com/qt
本文原始地址:http://www.qkevin.com/archives/77

前一篇:Signal & Slot, http://www.qkevin.com/archives/74
后一篇:QMetaObject class data members , http://www.qkevin.com/archives/81
======================================================================

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值