《Qt學習之路》側重 API 使用教程,而本系列《Qt源碼剖析》聚焦源代碼級的設計智慧。目標不是重寫一個 Qt,而是像研讀編譯器設計一樣,從 Qt 源碼中學習:
安裝 Qt (LGPL 版) 後,源碼已包含在安裝目錄:
<Qt安裝目錄>/2010.02.1/qt/src/ # 版本號目錄對應 Qt 4.6.1
├── corelib/ # QtCore 模塊核心
├── gui/ # QtGui 模塊
├── network/ # QtNetwork 模塊
└── ...
我們從最核心的 QtCore → corelib 開始。
日常代碼寫 #include <QObject>,預處理器經歷三層轉發:
<Qt安裝目錄>/include/QtCore/QObject → 僅含 #include "qobject.h"<Qt安裝目錄>/include/QtCore/qobject.h → 僅含 #include "../../src/corelib/kernel/qobject.h"<Qt安裝目錄>/src/corelib/kernel/qobject.h在 corelib/kernel/ 目錄下,QObject 相關文件:
| 文件 | 職責 |
|---|---|
qobject.h | QObject 類聲明:信號槽、屬性、事件、對象樹、動態屬性等核心介面 |
qobject.cpp | QObject 方法實現:構造/析構、connect()/disconnect()、事件分發、定時器、findChild() 等 |
qobjectdefs.h | 宏定義 (Q_OBJECT, SIGNAL, SLOT 等) + QMetaObject 類定義 (元對象系統基石) |
qobject_p.h | 私有數據類 QObjectPrivate (Pimpl 惯用法),封裝內部狀態:對象樹指針、信號槽連接列表、動態屬性表、事件過濾器等 |
附帶兩個工具類 (非核心):qobjectcleanuphandler.h/.cpp 實現 QObjectCleanupHandler,輔助跨模塊對象生命週期管理。
qobjectdefs.h:理解 QMetaObject 結構、Q_OBJECT 宏展開、信號槽簽名編碼規則。qobject_p.h:掌握 Private Data 模式 (即 Pimpl),看內部如何組織連接列表、屬性表、事件過濾器。qobject.h:公共 API 設計、虛函數介面、友元聲明 (允許 QObjectPrivate 訪問私有成員)。qobject.cpp:核心邏輯實現,重點關注 connect() 內部如何構建連接、activate() 如何遍歷槽函數、事件循環分發流程。將深入剖析 信息隱藏機制:Q_D/Q_Q 宏如何實現 Pimpl 惯用法,以及 Qt 為何放棄早期「私有類指針」改用宏方案。敬請期待!