Qt MetaObject 詳解之一 簡單介紹

2021-07-24 07:04:12 字數 2612 閱讀 2080

這個系列的幾篇文章通過閱讀qt幫助文件和相關的源**來學習研究qt meta-object所提供的功能,及其實現的方式。

1、qobject提供乙個基類,方便派生類使用meta-object系統的功能;

2、q_object巨集,在類的宣告體內啟用meta-object功能,比如動態屬性、訊號、槽;

3、meta object編譯器(moc),為每個qobject派生類生成**,以支援meta-object功能。

qobject定義了從乙個qobject物件訪問meta-object功能的介面,q_object巨集用來告訴編譯器該類需要啟用meta- object功能,編譯器在掃瞄乙個原始檔時,如果發現類的宣告中有這個巨集,就會生成一些**來為支援meta-object功能——主要是生成該類對應 metaobject類以及對qobject的函式override。

顧名思義,qmetaobject包含了qobject的所謂的元資料,也就是qobject資訊的一些描述資訊:除了型別資訊外,還包含qt中特 有的signal&slot資訊。

qobject::metaobject ()方法返回乙個qobject物件對應的metaobject物件,注意這個方法是virtual方法。如上文所說,如果乙個類的宣告中包含了 q_object巨集,編譯器會生成**來實現這個類對應的qmetaobject類,並過載qobject::metaobject()方法來返回這個 qmetaobject類的例項引用。這樣當通過qobject型別的引用呼叫metaobejct方法時,返回的是這個引用的所指的真實物件的 metaobject。

如果乙個類從qobject派生,確沒有宣告q_object巨集,那麼這個類的metaobject物件不會被生成,這樣這個類所宣告的 signal slot都不能使用,而這個類例項呼叫metaobject()返回的就是其父類的metaobject物件,這樣導致的後果就是你從這個類例項獲得的元 資料其實都是父類的資料,這顯然給你的**埋下隱患。因此如果乙個類從qobject派生,它都應該宣告q_object巨集,不管這個類有沒有定義 signal&slot和property。

這樣每個qobject類都有乙個對應的qmetaobject類,形成乙個平行的型別層次。

下面通過qmetaobject的介面來解讀qmetaobject提供的資訊:

1、基本資訊

const char * classname () const;

const qmetaobject * superclass () const

2、classinfo: 提供額外的類資訊。其實就是一些名值對。 使用者可以在類的宣告中以q_classinfo(name, value)方式新增。

int classinfocount () const

int classinfooffset () const

qmetaclassinfo classinfo ( int index ) const

int indexofclassinfo ( const char * name ) const

3、contructor:提供該類的構造方法資訊

qmetamethod constructor ( int index ) const

int constructorcount () const

int indexofconstructor ( const char * constructor ) const

4、enum:描述該類宣告體中所包含的列舉型別資訊

qmetaenum enumerator ( int index ) const

int enumeratorcount () const

int enumeratoroffset () const

int indexofenumerator ( const char * name ) const

5、method:描述類中所包含方法資訊:包括property,signal,slot等,包括祖先類,如何組織暫時不確定。

qmetamethod method ( int index ) const

int methodcount () const

int methodoffset () const

int indexofmethod ( const char * method ) const

int indexofsignal ( const char * signal ) const

int indexofslot ( const char * slot ) const

6、property:型別的屬性資訊

qmetaproperty property ( int index ) const

int propertycount () const

int propertyoffset () const

int indexofproperty ( const char * name ) const

qmetaproperty userproperty () const  //返回類中設定了user flag的屬性,(難道只能有乙個這樣的屬性?)

注意:對於類裡面定義的函式,建構函式,列舉,只有加上一些巨集才表示你希望為方法提供meta資訊。比如 q_enums用來註冊巨集,

q_invacable用來註冊方法(包括建構函式)。qt這麼設計的原因應該是避免meta資訊的臃腫。

MSSQL之DTS工具之詳解

img 設定複製的具體屬性,這裡重點說一下 1 建立目標 表,檢視,儲存過程,約束等 刪除目標 預設選項,如果存在物件就刪除 包括依賴的元件 預設選項,比如你複製乙個自定義函式,dts會把相關的表傳送過去 包括擴充套件屬性 非預設選項,複製sql server的擴充套件屬性,比如欄位的描述資訊等 2...

iOS之謂詞詳解

nsarray testarray nsarray arraywithcontentsoffile nsbundle mainbundle pathforresource zhaojunshabi oftype plist 建立乙個謂詞物件用謂詞物件來指定篩選的範圍 nspredicate pred...

IOS之定位詳解

1.匯入框架 import inte ce viewcontroller cllocationmanagerdelegate end implementation viewcontroller void viewdidload 5.獲取定位服務許可權 並且到 info.plist 進行相應配置,加乙...