Qt原始碼解析 1

2021-05-28 08:19:15 字數 1918 閱讀 8098

本文**

感謝原創者分享

如果你閱讀了 qt 的源**,你會看到一堆奇奇怪怪的巨集,例如 q_d,q_q。我們的qt原始碼之旅就從理解這些巨集說起。

下面先看乙個c++的例子。

cpp**

class person  

~person(){}  

string name();  

void setname(string name);  

int age();  

void setage(int a);  

private:  

string _name;  

int _age;  

};  

class person

~person(){}

string name();

void setname(string name);

int age();

void setage(int a);

private:

string _name;

int _age;

};

這是乙個很普通的 c++ 類 person,他有兩個屬性 name 和 age。我們試想一下,這個類要怎麼去使用呢?如果你不想給我源**,那麼至少也要給我乙個 dll 或者其他類似的東西,並且你要把這個標頭檔案給我,這樣我才能把它 include 到我的**中使用。我只能使用你暴露給我的 public 的介面。按理說,private 的東西我是不應該知道的,但是現在我知道了!為什麼呢?因為我會去讀這個標頭檔案,我知道了,原來在 person 中,age 就是乙個 int,name 就是乙個 string。這是你不希望看到的,因為既然你把它宣告成了 private 的,就是不想讓我知道這些東西。那麼怎麼辦呢?嗯,我有乙個解決方案。來看下面的**:

person.h

cpp**

class person  

~person(){}  

string name();  

void setname(string name);  

int age();  

void setage(int a);  

private:  

personprivatedata *data;  

};  

class person

~person(){}

string name();

void setname(string name);

int age();

void setage(int a);

private:

personprivatedata *data;

};

persondata.cpp

cpp**

class personprivatedata  

;  

class personprivatedata

;

怎麼樣?在 person.h 中看不到我是怎麼儲存的資料了吧?嗯嗯,也許你很聰明:我還可以在 persondata.cpp 中找到那些宣告啊!當然,這是c++語法規定的,我們已經左右不了——但是,我為什麼非要把 cpp 檔案一併給你呢?因為你使用我的類庫的話完全不需要使用 cpp 檔案啊。

這就是一種資訊隱藏的方法。看上去很麻煩,原本很簡單的對 name 和 age 的訪問都不得不通過乙個指標去訪問它,何必呢?其實這樣做是有好處的:

這就是 c++ 的一種設計方法,被稱為 private class,大約就是私有類吧!更確切地說應該是私有資料類。據說,這也是 qt 2.x  的實現方式。但是如果你去看你的 qt sdk **,你是看不到這樣的語句的,取而代之的則是一些我們開頭所說的 q_d 這些巨集。或許你已經隱隱約約地猜到了,這些巨集就是實現這個的:private data。

QT 原始碼分析 1

編寫 qt 的時候,使用的語句是 include,對應的是qobject檔案,該檔案的位置可以在qt creator中用ctrl 滑鼠檢視,具體目錄為 5.10.1 mingw53 32 include qtcore,該檔案中只有一句話 include qobject.h qobject h的位置為...

jquery原始碼解析1

學了很久的js也寫了很長時間的jquery了,這裡來以學習的態度來看大牛的思想和架構。使用的是當前最新版本 3.1.1 就不考慮煩人的ie 6 7 8了,輕鬆愉快。其實一上來不知所措,這都是啥?function global,factory return factory w else typeof ...

ClearCanvas 原始碼解析 1

國內,網上關於clearcanvas開源的文章太少,最近剛好在做pacs,發現這個原始碼後,除錯了一下,執行效果還可以。clearcanvas是c 開源原始碼,對pacs的解析操作,底層和c 開源fo dicom有什麼關係,還沒有時間去研究。看網上有 人有,clearcanvas的底層對dcm檔案的...