Q學習 4 QT的元物件系統

2021-07-11 14:03:21 字數 1796 閱讀 4167

qt對c++進行了擴充套件,提供了三個主要的功能:訊號槽、執行時型別資訊和動態屬性,這三個擴充套件功能都是由「元物件系統」提供的。

元物件系統基於三個支撐點:

1 oobject為需要使用元物件系統有點的類提供了基類。

2 q_object巨集宣告在類的私有段中,可用來啟用元物件特徵,如動態屬性,訊號槽。

3 元物件編譯器(moc)為每乙個qobject子類提供了實現元物件特徵的必要**。

moc工具讀取c++源**。如果它發現乙個或者多個類的宣告包括了巨集q_object,它產生另乙個c++源**檔案,這個檔案中包含了含有巨集q_objcet類的元物件**。這個新產生的原始檔或者被包含值類的原始檔中或者,或者更通常的是被編譯和鏈結到類的的實現中。

元物件系統除了提供訊號和槽機制(介紹元物件系統的主要原因),還提供如下特徵:

1 qobject::metaobject()返回了類關聯的元物件;

2 qmetaobjcet::classname()在執行時返回字串形式的類名稱,不需要通過c++編譯器的原始執行時型別資訊支援。

3 qobject::inherits()方法返回乙個物件是否是qobject類或者qobject子類的例項。

4 qobject::tr()和qobject::trutf8()用來完成國際化;

5 qobject::setproperty()和qobject::property()通過名稱動態的設定和獲取屬性;

6 qmetaobject::newinstance()構造類的新例項。

對qobject類也可以使用動態轉換qobject_cast(),qobject_cast()函式與標準c++dynamic_cast()的行為很像,優點是不需要rtti支援,並且它可以跨動態庫邊界。qobject_cast()嘗試將它的引數轉換到特定的指標型別,如果物件是正確的型別(在執行時判斷)返回非0指標,如果不相容則返回0。

看下面的例子。我們假設mywidget繼承了qwidget並且宣告了巨集q_object:

qobject *obj = new mywidget;

變數obj是qobject型別,實際引用到乙個mywidget物件,所以我們可以轉換:

qwidget *widget = qobject_cast(obj);

從qobject到qwidget的轉換是成功的,因為obj實際上就是乙個mywidget,是qwidget的子類。現在我們知道obj是乙個mywidget物件,我們可以轉換到mywidget *:

mywidget *mywidget = qobject_cast(obj);

到mywidget的轉換也是成功的,因為qobject_cast()對待qt內建型別和自定義型別之間沒有區別的。

下面的轉換則是失敗的:

qlabel *label = qobject_cast(obj);

obj到qlabel的轉換是失敗的。label也被設定為0。

這種執行時型別資訊機制可以在執行時處理不同型別的物件,比如:

if (qlabel *label = qobject_cast(obj))  

else if (qpushbutton *button = qobject_cast(obj))

當然也可以使用qobject做為基類卻不使用q_object巨集,這樣的類就沒有了元物件**,前文提到的訊號槽和其他特徵也就都失效了。從元物件系統的觀點來看,乙個不使用元**qobject子類等效於它最近的使用元物件**的祖先。這就意味著,qmetaobject::classname() 將會返回祖先的類名而不是實際類的名字。

因此強烈建議大家,所有qobject的子類都使用q_object巨集,無論是否使用了訊號槽和動態屬性。

4 QT分析之除錯跟蹤系統

在我們前面的分析中,經常看到qwarning 和qdebug 之類的呼叫。今天深入的分析qt的除錯跟蹤系統。我們先看qdebug.h中的巨集定義 1 if defined qt no debug stream 2 q core export inline qdebug qdebug 3 4 else...

Qt學習筆記 Qt元物件系統

qt元物件系統提供了物件間的通訊機制 訊號和槽 執行時型別資訊和動態屬性系統的支援,是標準c 的乙個擴充套件,它使qt能夠更好的實現gui圖形使用者介面程式設計。qt的元物件系統不支援c 模板,儘管模板擴充套件了標準c 的功能,但是元物件系統提供了模板無法提供的一些特性。qt的元物件系統基於以下三個...

Qt元物件系統

qmetaobject是負責元物件資訊的類,每個繼承自qobject的類都會有乙個qmetaobject物件,qobject物件共用該qmetaobject物件,給類提供遠多於c 預設的typeinfo提供的資訊。主要內容如下 1 類資訊 類 qmetaclassinfo q classinfo q...