Qt核心剖析: 寻找 QObject 的源代码

原本打算把《Qt学习之路》做为一个相似教程的东西,因此就不打算把一些关系到源代码的内容放在那个系列之中啦。所以今天就先来看一个新的开始吧!这个系列估计不会进展很快,由于最近公司里面要作 flex 的项目演示,因此时间不是不少啦,而且源代码也不是那么容易看的。豆子也不是 C/C++ 出身,所以看起来也会有些麻烦。算法

《Qt源码剖析》做为一个独立的系列,大体就是对Qt的源代码进行分析。我的觉得,分析的目的不在于你去写一个Qt出来,而是学习它的设计巧妙之处。正如咱们去学习编译器的设计与实现,也并非非要写一个编译器出来,而是学习到不少有用的算法和设计思路。这些才是更加须要注意的,也是比起写一个Qt更为现实的。ide

《Qt源码剖析》就不做为一个按部就班的系列啦!由于源代码看起来也不可能会有一个按部就班的过程,只能看多少说多少。可是豆子仍是会努力把要说的东西表达清楚的!工具

固然,这么一个系列确定少不了站在巨人的肩膀上去看问题。下面列出一些相似的系列:学习

同不少源代码剖析的文章同样,这个系列可能让初学者看不明白,不过有兴趣的童鞋也要去各处学习下啊~flex

下面咱们要说的第一个问题是,哪里能找到Qt源代码。ui

不出意外的话,你安装的Qt应该是 LGPL 版本的。这个版本已经包括了完整的Qt源代码。下面打开你的Qt安装目录,你会看到2010.02.1这样的时间做为名称的目录,这就是Qt的版本号。4.6.1版对应的日期目录就是2010.02.1.进入这个目录,里面有一个 qt 目录,在这个 qt 目录中,你会找到 src 目录。这里面就是完整的 Qt 源代码。咱们所要分析的代码,你就能够在这里找到啦!spa

下面咱们从 QObject 这个最主要的类开始提及。设计

按照前面咱们说过的路径,咱们进入 qt/src 文件夹。你可能对这里的目录名时曾相识,由于几乎这里的全部文件夹名都对应着 Qt 的模块的名字:gui,network,multimedia等等。咱们从最核心的 QtCore 开始。这个模块对应的是corelib文件夹。继承

首先咱们要去寻找 QObject 这个类。之因此选择 QObject,一是由于它是 Qt 的核心类,另一个很重要的缘由是,QObject类是一个典型的Qt类,咱们能够经过这个类学习到Qt的设计思路。教程

回忆一下咱们编写 Qt 代码的时候,使用的语句是

  
  
           
  
  
  1. #include <QObject> 

当咱们进行 #include 语句时,预处理器寻找的是qt/include/QtCore这个目录。咱们在这里面找到了 QObject 文件,而这里面只有一个语句:

  
  
           
  
  
  1. #include "qobject.h" 

而后咱们在同一个目录下又找到了这个 qobject.h,这里面也只有一句:

  
  
           
  
  
  1. #include "../../src/corelib/kernel/qobject.h" 

而这个路径就是咱们前面找到的那个 qobject 所在的位置!

所以咱们回到在 corelib 里面,能够看到 kernel 文件夹。看到名字就应该知道,这就是Qt corelib 的核心。在这里面,咱们能够找到有四个文件以 qobject 打头:

  • qobject.h:QObject 的类定义,这个就是 QObject 文件引用的文件,也就是咱们使用的实际头文件;
  • qobject.cpp:QObject的实现代码;
  • qobjectdefs.h:这个文件中定义了不少用到的宏,而且定义了QMetaObject类,而这个类是实现signal- slot的基础;
  • qobject_p.h:对 QObject 的辅助数据类;

实际上咱们还会看到另外两个文件:qobjectcleanuphandler.h 和 qobjectcleanuphandler.cpp。不过若是打开这两个文件就会发现,这里面定义的是一个QObjectCleanupHandler 类,而这个类是继承了 QObject 的,所以这只是一个普通的工具类,不在咱们目前的讨论之列。所以咱们能够认为,QOjbect 类是由4个文件共同实现的:qobject.h,qobject.cpp,qobjectdefs.h和qobject_p.h。

相关文章
相关标签/搜索