元物件系統這樣工作:
●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...