Qt源码分析之QObject.doc

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Qt源码分析之QObject

Qt源码分析之QObject Qt的QObject 1.试验代码: #include QApplication #include QtCore #include QtGui int main(int argc, char *argv[]) { QApplication app(argc, argv); int size = sizeof(QObject); QPushButton* quit = new QPushButton(Quit); delete quit; return app.exec(); } QObject是Qt类体系的唯一基类,就象MFC中的CObject和Dephi中的TObject,是Qt各种功能的源头活水,因此Qt源码分析的第一节就放在这个QObject上 int size = sizeof(QObject); QObject的大小是8,除了虚函数表指针需要的4个字节以外,另外的4个字节是: QObjectData *d_ptr; QObject中的数据被封装在QObjectData类中了,为什么要封装数据呢? 原因是Qt中有一个很重要的设计模式就是句柄实体模式,也就是以QObject为基类的类一般都是句柄类,一般只有一个指针指向一个实体类,在实体类中保存全部的数据,而且一般情况下这个指针还是私有的,方便以后修改句柄类的实现细节。 因此,也可以说和句柄类继承关系平行的也有一套实体类派生体系,因此,准确的说,Qt的基类其实有两个,一个是QObject,这是句柄类的唯一基类,另一个是QObjectData,这是实体类的基类 QObjectData类定义如下: class QObjectData { public: virtual ~QObjectData() = 0; QObject *q_ptr; QObject *parent; QObjectList children; uint isWidget : 1; uint pendTimer : 1; uint blockSig : 1; uint wasDeleted : 1; uint ownObjectName : 1; uint sendChildEvents : 1; uint receiveChildEvents : 1; uint unused : 25; int postedEvents; #ifdef QT3_SUPPORT int postedChildInsertedEvents; #else int reserved; #endif }; QObject *q_ptr; 这个指针指向实体类对应的句柄类,这和上面的代码 QObjectData *d_ptr; 遥相呼应,使得句柄类和实体类可以双向的引用,为什么是这样的命名方式呢?可能q指的是Qt接口类,d指的是Data数据类,这当然是猜测了,但是或许可以方便你记忆,在Qt中,这两个指针名字是非常重要的,必须记住。 但是仅仅如此还是不容易使用这两个指针,因为它们都是基类的类型,难道每次使用都要类型转换吗?为了简单起见,Qt在这里声明了两个宏 #define Q_DECLARE_PRIVATE(Class) \ inline Class##Private* d_func() { return reinterpret_castClass##Private *(d_ptr); } \ inline const Class##Private* d_func() const { return reinterpret_castconst Class##Private *(d_ptr); } \ friend class Class##Private; #define Q_DECLARE_PUBLIC(Class) \ inline Class* q_func() { return static_castClass *(q_ptr); } \ inline const Class* q_func() const { return static_castconst Class *(q_ptr); } \ friend class Class; 只要在类的头文件中使用这两个宏,就可以通过函数直接得到实体类和句柄类的实际类型了,而且这里还声明了友元,使得数据类和句柄类连访问权限也不用顾忌了。 而且为了cpp文件中调用的方便,更是直接声明了以下两个宏 #define Q_D(Class) Class##Private * con

文档评论(0)

bm5044 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档