1. 程式人生 > >Qt整體框架淺析(一) -物件模型

Qt整體框架淺析(一) -物件模型

最近在膠著於QT的框架以及其核心,

本文作為學習的總結,如果有誤,望指正。

   首先介紹一下Qt的整體框架,Qt作為一個GUI的解決方案,其被設計為基於面向物件,跨平臺,並直接與底層介面的framework,下圖為主要的層次結構:

qt_architecture

    下邊將從物件模型,事件機制,通訊機制,定時器,Frame,模板,執行緒以及Qstring這幾個方面來作為切入點,嘗試去架構描述這個龐大的體系。

1.物件模型

   C++標準中雖然有很多的對實時的物件模型的支援,但其靜態的特性,導致其仍然缺乏靈活性,Qt提供了自己的物件模型。

   主要包括物件樹,物件屬性,以及元物件系統等

   1)物件樹(Object tree ),由於GUI的設計層次結構比較強,並需要兼顧效率,Qt設計了物件樹,並支援了動態類型別轉換,其中父物件與子物件相互指向,整體的結構關係相當於一個森林, 父物件與子物件為一對多的關係,並有多個平行的父物件。其中有兩點需要注意,首先當父物件析構的時候將析構所有的子物件,如果子物件在棧中或者為全域性變數,有可能導致重複析構,程式崩潰(* C++標準中,區域性變數析構的順序是構造過程的逆向 );其次如果事件在傳送中將QObject(* QObject作為其最終的基類,源自官方Qt文件中~QObject() )析構,也可能導致多執行緒呼叫過程中的崩潰。

   2)物件屬性(Object properties ),物件屬性是基於元物件系統( Meta-Class system ,訊號槽機制 signals and slots 也基於該模組, 在後邊的章節將會具體談),Qt中的Q_PROPORTY(...)巨集標記了相關屬性資訊,將其註冊到QMetaObject中,QMetaObject記錄了所有註冊過的屬性資訊,允許程式在編譯時不知情的一些資訊,在實時執行階段能夠動態新增進來。

       相當於一個盒子,假設我是盒子的設計者,我並不知道將來盒子裡要放什麼東西,設計的要求是,我可以放新的東西進來也可以新增已有的東西,也可以將盒子更改我自定義的樣式。

   3)元物件系統( meta-class system ),元物件系統負責訊號槽機制,實時型別判斷,以及物件屬性。這個系統依賴於MOC( meta object complier ),MOC“閱讀”程式碼,將所有標記資訊讀入,整理,來滿足上面所述3個方面的應用。

       在QObject所屬子類中,所有擁有QMetaObject的類都支援反射模式(並不被C++標準支援),但Qt通過MOC間接支援了該設計模式,QMetaObject提供了類的屬性以及方法描述資訊,下圖給出了一個例子

meta class system