原本打算把《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 代码的时候,使用的语句是
- #include <QObject>
当咱们进行 #include 语句时,预处理器寻找的是qt/include/QtCore这个目录。咱们在这里面找到了 QObject 文件,而这里面只有一个语句:
- #include "qobject.h"
而后咱们在同一个目录下又找到了这个 qobject.h,这里面也只有一句:
- #include "../../src/corelib/kernel/qobject.h"
而这个路径就是咱们前面找到的那个 qobject 所在的位置!
所以咱们回到在 corelib 里面,能够看到 kernel 文件夹。看到名字就应该知道,这就是Qt corelib 的核心。在这里面,咱们能够找到有四个文件以 qobject 打头:
实际上咱们还会看到另外两个文件:qobjectcleanuphandler.h 和 qobjectcleanuphandler.cpp。不过若是打开这两个文件就会发现,这里面定义的是一个QObjectCleanupHandler 类,而这个类是继承了 QObject 的,所以这只是一个普通的工具类,不在咱们目前的讨论之列。所以咱们能够认为,QOjbect 类是由4个文件共同实现的:qobject.h,qobject.cpp,qobjectdefs.h和qobject_p.h。