qt的元物件系統為物件間通訊、執行時型別資訊和動態屬性系統提供了訊號和槽機制。
元物件系統基於三個方面:
qobject類為可以利用元物件系統的物件提供基類。
q_object巨集用於啟用元物件特性,例如動態屬性、訊號和槽。
元物件編譯器(moc)為每個qobject子類提供實現元物件特性所需的**。
moc工具讀取c++原始檔。如果它在類中找到包含q_object巨集宣告,則生成另乙個c++原始檔,其中包含每個類的元物件**。生成的原始檔要麼包含到類的原始檔中,要麼更通常是編譯並與類的實現鏈結。
除了提供物件間通訊的訊號和槽機制,元物件**還提供以下功能:
qobject::metaobject()返回類的關聯元物件。
qmetaobject::classname() 在執行時返回類名為字串,而不需要通過c++編譯器支援本機執行時型別資訊(rtti)。
qobject::inherits()返回物件是否是繼承qobject或其子類。
qobject::tr()為國際化轉換字串。
qobject::setproperty()和qobject::property()按名稱動態設定和獲取屬性。
qmetaobject::newinstance()構造類的新例項。
也可以在qobject類上使用qobject_cast()執行動態強制轉換。qobject_cast()函式的行為類似於標準c++動態dynamic_cast(),其優點是不需要rtti支援。它嘗試將其引數強制轉換為尖括號中指定的指標型別,如果物件的型別正確(在執行時確定),則返回非零指標;如果物件的型別不相容,則返回nullptr。
雖然可以使用qobject作為基類卻不使用q_object巨集和元物件**,但是如果不使用q_object巨集,則這裡訊號和槽以及其他特性都將不可用。從元物件系統的觀點來看,沒有元**的qobject子類等同於有元物件**的最近祖先。例如,這意味著qmetaobject::classname()將不返回類的實際名稱,而是返回該祖先的類名。
因此,強烈建議qobject的所有子類使用q_object巨集,而不管它們是否實際使用訊號槽和屬性。
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.編譯器 元物件編譯...