分类: LINUX
2015-10-12 17:27:19
QObject 把它们自己组织在对象树中。当你创建一个 QObject 并使用其它对象作为父对象时,这个对象会自动添加到父对象的 children() list 中。父对象拥有这个对象,比如,它将在它的析构函数中自动删除它所有的 child 对象。你可以通过 findChild() 或者 findChildren()函数来查找一个对象。
每个对象都有一个对象名称(objectName())和类名称(class name), 他们都可以通过相应的 metaObject 对象来获得。你还可以通过 inherits() 方法来判断一个对象的类是不是从另一个类继承而来。
当对象被删除时,它发出destroyed()信号。你可以捕获这个信号来避免对QObject的无效引用。
QObject可以通过event()接收事件并且过滤其它对象的事件。详细情况请参考installEventFilter()和eventFilter()。
对于每一个实现了信号、槽和属性的对象来说,Q_OBJECT 宏都是必须要加上的。
QObject 实现了这么多功能,那么,它是如何做到的呢?让我们通过它的 Source Code 来解开这个秘密吧。
QObject 类的实现文件一共有四个:
* qobject.h,QObject class 的基本定义,也是我们一般定义一个类的头文件
* qobject.cpp,QObject class 的实现代码基本上都在这个文件
* qobjectdefs.h,这个文件中最重要的东西就是定义了 QMetaObject class,这个class是为了实现 signal、slot、properties,的核心部分。
* qobject_p.h,这个文件中的 code 是辅助实现 QObject class 的,这里面最重要的东西是定义了一个 QObjectPrivate 类来存储 QOjbect 对象的成员数据。
理解这个 QObjectPrivate class 又是我们理解 Qt kernel source code 的基础,这个对象包含了每一个 Qt 对象中的数据成员,好了,让我们首先从理解 QObject 的数据存储代码开始我么的 Qt Kernel Source Code 之旅。
敬请关注下一节:QObject 对象数据存储
======================================================================
声明:
《Inside Qt Series》专栏文章是()原创技术文章。
本系列专栏文章可随意转载,但必须保留本段声明和每一篇文章的原始地址。
作者保留版权,未经作者同意,不得用于任何商业用途
《Inside Qt Series》专栏文章总索引:
本文原始地址: