Inside QT Series (八):Meta Object Class
来源:互联网 发布:ubuntu deepin qq 编辑:程序博客网 时间:2024/05/01 11:54
关于Qt的更多精彩技术文章,请看:http://www.InsideQt.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)
请参考下图:
QMetaOb ject 对象与 QT 类之间的关系:
- 每一个 QMetaObject 对象包含了与之相对应的一个 QT 类的元信息
- 每一个 QT 类(QObject 以及它的派生类) 都有一个与之相关联的静态的(static) QMetaObject 对象(注:class的定义中必须有 Q_OBJECT 宏,否则就没有这个Meta Object)
- 每一个 QMetaObject 对象保存了与它相对应的 QT 类的父类的 QMetaObject 对象的指针。 或者,我们可以这样说:“每一个QMetaObject对象都保存了一个其父亲(parent)的指针”.注意:严格来说,这种说法是不正确的,最起码是不严谨的。
请参考下图:
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》专栏文章是Qt核心技术论坛(InsideQt.com)原创技术文章。
本系列专栏文章可随意转载,但必须保留本段声明和每一篇文章的原始地址。
未经作者同意,不得用于商业用途
《Inside Qt Series》专栏文章总索引:
http://www.insideqt.com/bbs/viewthread.php?tid=9&extra=page%3D1
本文原始地址:
http://www.insideqt.com/bbs/viewthread.php?tid=17&extra=page%3D1
====================================
- Inside QT Series (八):Meta Object Class
- Inside Qt Series (八):Meta Object Class overview
- Inside Qt Series (八):Meta Object Class overview
- Inside Qt Series (八):Meta Object Class overview
- Inside QT Series (五):元对象系统(Meta-Object System)
- Inside Qt Series (五):元对象系统(Meta-Object System)
- Inside QT Series (三):元对象系统(Meta-Object System)
- Inside QT Series (五):元对象系统(Meta-Object System)
- Inside Qt Series (五):元对象系统(Meta-Object System)
- Inside QT Series (六):元对象编译器 - Meta Object Compiler (moc)
- Inside Qt Series (六):元对象编译器 – Meta Object Compiler (moc)
- Inside Qt Series (六):元对象编译器 – Meta Object Compiler (moc)
- Inside Qt Series (六):元对象编译器 – Meta Object Compiler (moc)
- [Qt教程] Inside Qt Series (六):元对象编译器 – Meta Object Compiler (moc)moc, Qt教程
- Inside QT Series (九):QMetaObject class data members
- Inside Qt Series (九):QMetaObject class data members
- Inside Qt Series (九):QMetaObject class data members
- Inside Qt Series (九):QMetaObject class data members
- 还好
- Java远程通讯可选技术及原理
- 用LINUX作CVS服务器
- 电信运营商三户模型的设计分析(转载)
- 获取java项目相关路径
- Inside QT Series (八):Meta Object Class
- MOSS 2007 部署Feature脚本
- 伦敦同业拆借利率(LIBOR)
- CSDN的新IM投入测试?我在博客里看到了!
- .net C# 算法
- 做程序其实可痛苦的了......
- Spring AOP+ehCache简单缓存系统解决方案
- GPRS分类
- 用枚举增强单例模式的可靠性 - Effective Java 中文版第二版的读书心得(三)