天天看點

Qt核心剖析: 尋找 QObject 的源代碼

本來打算把《Qt學習之路》作為一個類似教程的東西,是以就不打算把一些關系到源代碼的内容放在那個系列之中啦。是以今天就先來看一個新的開始吧!這個系列估計不會進展很快,因為最近公司裡面要做 flex 的項目示範,是以時間不是很多啦,并且源代碼也不是那麼容易看的。豆子也不是 C/C++ 出身,是以看起來也會有些麻煩。

《Qt源碼剖析》作為一個獨立的系列,大緻就是對Qt的源代碼進行分析。個人以為,分析的目的不在于你去寫一個Qt出來,而是學習它的設計巧妙之處。正如我們去學習編譯器的設計與實作,也并不是非要寫一個編譯器出來,而是學習到很多有用的算法和設計思路。這些才是更加需要注意的,也是比起寫一個Qt更為現實的。

《Qt源碼剖析》就不作為一個循序漸進的系列啦!因為源代碼看起來也不可能會有一個循序漸進的過程,隻能看多少說多少。但是豆子還是會努力把要說的東西表達清楚的!

當然,這麼一個系列肯定少不了站在巨人的肩膀上去看問題。下面列出一些類似的系列:

<a href="http://www.qkevin.com/qt" target="_blank">部落格</a>

同很多源代碼剖析的文章一樣,這個系列可能讓初學者看不明白,不過有興趣的童鞋也要去各處學習下啊~

下面我們要說的第一個問題是,哪裡能找到Qt源代碼。

不出意外的話,你安裝的Qt應該是 LGPL 版本的。這個版本已經包括了完整的Qt源代碼。下面打開你的Qt安裝目錄,你會看到2010.02.1這樣的時間作為名稱的目錄,這就是Qt的版本号。4.6.1版對應的日期目錄就是2010.02.1.進入這個目錄,裡面有一個 qt 目錄,在這個 qt 目錄中,你會找到 src 目錄。這裡面就是完整的 Qt 源代碼。我們所要分析的代碼,你就可以在這裡找到啦!

下面我們從 QObject 這個最主要的類開始說起。

按照前面我們說過的路徑,我們進入 qt/src 檔案夾。你可能對這裡的目錄名時曾相識,因為幾乎這裡的所有檔案夾名都對應着 Qt 的子產品的名字:gui,network,multimedia等等。我們從最核心的 QtCore 開始。這個子產品對應的是corelib檔案夾。

首先我們要去尋找 QObject 這個類。之是以選擇 QObject,一是因為它是 Qt 的核心類,另外一個很重要的原因是,QObject類是一個典型的Qt類,我們可以通過這個類學習到Qt的設計思路。

回憶一下我們編寫 Qt 代碼的時候,使用的語句是

#include &lt;QObject&gt; 

當我們進行 #include 語句時,預處理器尋找的是qt/include/QtCore這個目錄。我們在這裡面找到了 QObject 檔案,而這裡面隻有一個語句:

#include "qobject.h" 

然後我們在同一個目錄下又找到了這個 qobject.h,這裡面也隻有一句:

#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。

本文轉自 FinderCheng 51CTO部落格,原文連結:http://blog.51cto.com/devbean/322343

繼續閱讀