Inside Qt Series (一):Starting From the QObject

作者:Q-Kevin @ http://www.qkevin.com

    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》專欄文章是(http://www.qkevin.com)原創技術文章。
本系列專欄文章可隨意轉載,但必須保留本段聲明和每一篇文章的原始地址。
作者保留版權,未經作者同意,不得用於任何商業用途

《Inside Qt Series》專欄文章總索引: http://www.qkevin.com/qt
本文原始地址:http://www.qkevin.com/archives/18

前一篇:Preface, http://www.qkevin.com/archives/13
後一篇:對象數據存儲(A), http://www.qkevin.com/archives/31
==================================================

發佈了1 篇原創文章 · 獲贊 2 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章