編寫 qt **的時候,使用的語句是 #include, 對應的是qobject檔案,該檔案的位置可以在qt creator中用ctrl+滑鼠檢視,具體目錄為\5.10.1\mingw53_32\include\qtcore,該檔案中只有一句話:#include
"qobject.h",qobject .h的位置為 \5.10.1\src\qtbase\src\corelib\kernel,在該kernel資料夾下,可以找到有四個檔案以 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。
/////////////////類成員變數的封裝方法: //////////////////////////
下面先看乙個c++的例子。
這是乙個很普通的 c++ 類 person,他有兩個屬性 name 和age。這個類要怎麼去使用呢?如果你不想給我源**,那麼至少也要給我乙個 dll或者其他類似的東西,並且你要把這個標頭檔案給我,這樣我才能把它 include 到我的**中使用。我只能使用你暴露給我的 public的介面。按理說,private 的東西我是不應該知道的,但是現在我知道了!為什麼呢?因為我會去讀這個標頭檔案,我知道了,原來在person 中,age 就是乙個 int,name 就是乙個 string。這是你不希望看到的,因為既然你把它宣告成了private 的,就是不想讓我知道這些東西。那麼怎麼辦呢?嗯,我有乙個解決方案。來看下面的**:
在 person.h 中看不到我是怎麼儲存的資料了吧?嗯嗯,也許你很聰明:我還可以在 persondata.cpp中找到那些宣告啊!當然,這是c++語法規定的,我們已經左右不了——但是,我為什麼非要把 cpp檔案一併給你呢?因為你使用我的類庫的話完全不需要使用 cpp 檔案啊。----------------我看到5.10.1的qobject.h裡面包含了 qobjectdata類的定義,難道5.10.1沒有對object類的資料成員進行掩蓋,直接全部暴露?
這就是一種資訊隱藏的方法。看上去很麻煩,原本很簡單的對 name 和 age的訪問都不得不通過乙個指標去訪問它,何必呢?其實這樣做是有好處的:
這就是 c++ 的一種設計方法,被稱為 private class,大約就是私有類吧!更確切地說應該是私有資料類。據說,這也是qt 2.x 的實現方式。但是如果你去看你的 qt sdk**,你是看不到這樣的語句的,取而代之的則是一些我們開頭所說的 q_d這些巨集。或許你已經隱隱約約地猜到了,這些巨集就是實現這個的:private data。
Qt原始碼解析 1
本文 感謝原創者分享 如果你閱讀了 qt 的源 你會看到一堆奇奇怪怪的巨集,例如 q d,q q。我們的qt原始碼之旅就從理解這些巨集說起。下面先看乙個c 的例子。cpp class person person string name void setname string name int age...
Qt原始碼分析之QPointer
qpointer是乙個指標封裝類,其作用類似於智慧型指標,但是它最大的特點應該是在指標的控制上,它希望乙個qt的指標 當然是從qobject派生的 可以同時被多個類擁有,這在 介面程式設計中當然是很常見的事情了,但是當這個指標被刪除時,我們不希望再找到那兩個介面類然後通知它們,相反我們希望這兩個介面...
cvDilate 原始碼分析 1
在cv.h檔案中對cvdilate的定義如下 cvapi void cvdilate const cvarr src,cvarr dst,iplconvkernel element cv default null int iterations cv default 1 iplconvkernel 指...