QT中元物件系統(MOC)原理

2021-06-17 19:17:40 字數 1417 閱讀 2174

元物件系統這樣工作:

●q_object

巨集宣告一些內省函式(

metaobject

(),tr(),qt_matacall()

和少量其他的函式)。這些函式必須在所有的

qobject

的子類中被實現。●qt

的moc

工具負責執行被

q_object

巨集宣告的函式,同時負責執行所有的訊號函式。

●qobject

的成員函式,例如

connect()和

disconnect

(),使用內省函式來工作。

元物件系統基於以下三類: 1

)、qobject類; 2

)、類宣告中的私有段的

q_object巨集;3

)、元物件編譯器。

moc讀取

c++原始檔。如果它發現其中包含乙個或多個類的宣告中含有

q_object

巨集,它就會給含有

q_object

巨集的類生成另乙個含有元物件**的

c++原始檔。這個生成的原始檔可以被類的原始檔包含(

#include

)到或者和這個類的實現一起編譯和連線。

除了提供物件間通訊的訊號和槽機制之外(這也是介紹這個系統的主要原因),

qobject

中的元物件**也實現其它特徵:1)、

classname()

函式在執行的時候以字串返回類的名稱,不需要

c++編譯器中的執行時刻型別識別(

rtti

)的支援。2)、

inherits()

函式返回這個物件是否是乙個繼承於

qobject

繼承樹中乙個特定類的類的例項。3)、

tr()

和trutf8()

兩個函式是用於國際化的字串翻譯。4)、

setporperty()

和property()

兩個函式是用來通過名稱動態設定和獲得物件屬性的。5)、

metaobject()

函式返回這個類所關聯的元物件。

雖然使用

qobject

作為乙個基類而不使用

q_object

巨集和元物件**是可以的,但是如果

q_object

巨集沒有被使用,那麼這裡的訊號和槽以及其它特徵描述都不會被提供。根據元物件系統的觀點,乙個沒有元**的

qobject

的子類和它含有元物件**的最近的祖先相同。舉例來說就是,

classname()

將不會返回你的類的實際名稱,返回的是它的這個祖先的名稱。我們

強烈建議

qobject

的所有子類使用

q_object

巨集,而不管它們是否實際使用了訊號、槽和屬性。

Qt元物件編譯器(moc)

qt的元物件系統是用來處理物件間通訊的訊號和槽,它執行資訊型別和動態屬性。qt的元物件系統包括以下3個部分的內容 1 qobject類 2 類宣告私有段中的q object巨集 3 元物件編譯器 元物件編譯器讀取c 原始檔時,如果發現在檔案中類的宣告中含有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...