QObject 這個 class 是 QT 物件模型的核心,絕大部分的 QT 類都是從這個類繼承而來。這個模型的中心特徵就是一個叫做訊號和槽(signal and slot)的機制來實現對象間的通訊,你可以把一個訊號和另一個槽通過 connect(…) 方法串連起來,並可以使用 disconnect(…) 方法來斷開這種串連,你還可以通過調用 blockSignal(…) 這個方法來臨時的阻塞訊號,
QObject 把它們自己組織在對象樹中。當你建立一個 QObject 並使用其它對象作為父物件時,這個對象會自動添加到父物件的 children() list 中。父物件擁有這個對象,比如,它將在它的解構函式中自動刪除它所有的 child 對象。你可以通過 findChild() 或者 findChildren()函數來尋找一個對象。
每個對象都有一個對象名稱(objectName())和類名稱(class name), 他們都可以通過相應的 metaObject 對象來獲得。你還可以通過 inherits() 方法來判斷一個對象的類是不是從另一個類繼承而來。
當對象被刪除時,它發出destroyed()訊號。你可以捕獲這個訊號來避免對QObject的無效引用。
QObject可以通過event()接收事件並且過濾其它對象的事件。詳細情況請參考installEventFilter()和eventFilter()。
對於每一個實現了訊號、槽和屬性的對象來說,Q_OBJECT 宏都是必須要加上的。
QObject 實現了這麼多功能,那麼,它是如何做到的呢。讓我們通過它的 Source Code 來解開這個秘密吧。
QObject 類的實現檔案一共有四個, qobject.h,QObject class 的基本定義,也是我們一般定義一個類的標頭檔 qobject.cpp,QObject class 的實現代碼基本上都在這個檔案 qobjectdefs.h,這個檔案中最重要的東西就是定義了 QMetaObject class,這個class是為了實現 signal、slot、properties,的核心部分。 qobject_p.h,這個檔案中的 code 是輔助實現 QObject class 的,這裡面最重要的東西是定義了一個 QObjectPrivate 類來儲存 QOjbect 對象的成員資料。
理解這個 QObjectPrivate class 又是我們理解 QT kernel source code 的基礎,這個對象包含了每一個 QT 對象中的資料成員,好了,讓我們首先從理解 QObject 的資料存放區代碼開始我麼的 QT Kernel Source Code 之旅。
敬請關注下一節:QObject 對象資料存放區
====================================
聲明:
《Inside Qt Series》專欄文章是Qt核心技術論壇(InsideQt.com)原創技術文章。
本系列專欄文章可隨意轉載,但必須保留本段聲明和每一篇文章的原始地址。
未經作者同意,不得用於商業用途
《Inside Qt Series》專欄文章總索引:
http://www.insideqt.com/bbs/viewthread.php?tid=9&extra=page%3D1
本文原始地址:
http://www.insideqt.com/bbs/viewthread.php?tid=4&extra=page%3D1
====================================