Qt 核心功能(00) 元物件系統 官翻

2021-10-25 09:42:13 字數 1978 閱讀 3456

qt的元物件系統為物件間通訊、執行時型別資訊和動態屬性系統提供了訊號和槽機制。

物件系統基於以下三件事:

qobject類為可以利用元物件系統的物件提供了乙個基類。

類宣告的私有部分中的q_object巨集用於啟用元物件特性,如動態屬性、訊號和槽。

元物件編譯器(moc)為每個qobject子類提供實現元物件特性所需的**。

物件編譯器(moc)工具讀取乙個c++原始檔。如果它發現乙個或多個包含q_object巨集的類宣告,它將生成另乙個c++原始檔,其中包含每個類的元物件**。生成的原始檔要麼被#include到類的原始檔中,要麼被編譯並鏈結到類的實現中。

了提供物件之間通訊的訊號和插槽機制(引入該系統的主要原因)之外,元物件**還提供了以下額外功能:

可以在qobject類上使用qobject_cast()執行動態轉換。 qobject_cast()函式的行為與標準c ++ dynamic_cast()相似,其優點是它不需要rtti支援,並且可以跨動態庫邊界工作。 它嘗試將其引數轉換為尖括號中指定的指標型別,如果物件的型別正確(在執行時確定),則返回非零指標;如果物件的型別不相容,則返回nullptr。

如,假設mywidget繼承自qwidget並使用q_object巨集宣告:

qobject *obj =

new mywidget;

qobject *型別的obj變數實際上是指mywidget物件,因此我們可以對其進行適當的轉換:

qwidget *widget = qobject_cast>

(obj)

;

qobject到qwidget的轉換成功,因為該物件實際上是mywidget,它是qwidget的子類。 由於我們知道obj是mywidget,因此我們也可以將其強制轉換為mywidget *:

mywidget *mywidget = qobject_cast>

(obj)

;

於qobject_cast()在內建qt型別和自定義型別之間沒有區別,因此將其強制轉換為mywidget是成功的。

qlabel *label = qobject_cast>

(obj)

;// label is 0

一方面,對qlabel的強制轉換失敗。 然後將指標設定為0。這使得可以根據型別在執行時以不同方式處理不同型別的物件:

if

(qlabel *label = qobject_cast>

(obj)

)else

if(qpushbutton *button = qobject_cast>

(obj)

)

管可以在沒有q_object巨集且沒有元物件**的情況下將qobject用作基類,但如果不使用q_object巨集,則訊號和插槽以及此處描述的其他功能都將不可用。 從元物件系統的角度來看,沒有元**的qobject子類等效於它的具有元物件**的最接近的祖先。 例如,這意味著qmetaobject :: classname()不會返回類的實際名稱,而是該祖先的類名稱。

此,我們強烈建議qobject的所有子類都使用q_object巨集,而不管它們是否實際使用訊號,插槽和屬性。

請參見qmetaobject,qt的屬性系統以及訊號和插槽。

有些類不是qobject的子類,但是也能使用元物件系統的某些功能,比如qeasingcurve::staticmetaobject ,因為源**中有q_gadget巨集。

Qt元物件系統

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

Qt元物件系統

產生背景 qt的元物件系統為物件間的通訊提供了訊號槽機制 執行時型別資訊 動態屬性系統。核心內容 qt的元物件系統實現基於三方面 1.qobject基類。為能夠利用元物件系統的物件提供了乙個基類。2.q object巨集。用於實現元物件特性,如動態屬性 訊號槽。3.meta object compi...

Qt元物件系統

系統介紹 qt 元物件系統 meta object system qt的元物件系統基於如下三件事情 1.類 qobject,為所有需要利用元物件系統的物件提供了乙個基類。2.巨集 q object,通常可以宣告在類的私有段中,讓該類可以使用元物件的特性,比如動態屬性,訊號和槽。3.編譯器 元物件編譯...