原本打算把《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。