国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

解析 Qt 內(nèi)省機制

移動開發(fā)
Qt 內(nèi)省機制是本文要介紹的內(nèi)容,內(nèi)省是什么?內(nèi)省是指面向?qū)ο笳Z言的一種在運行期間查詢對象信息的能力。先來看本文!

本文介紹的是Qt 內(nèi)省機制,關于內(nèi)省,新手的原因,我們一塊學習,所謂內(nèi)省是指面向?qū)ο笳Z言的一種在運行期間查詢對象信息的能力, 比如如果該語具有運行期間檢查對象型別的能力,那么我們稱它是型別內(nèi)省(type intropection)的,型別內(nèi)省可以用來實施多態(tài)。

c++內(nèi)省比較有限,它僅支持上面所說的型別內(nèi)省C++的型別內(nèi)省是通過運行時類型識別(RTTI)(Run-Time Type Information)中的typeid 以及 dynamic_case關鍵字來實現(xiàn)的,舉例說明:

  1.     // rabbit 派生于 Animal, jump為虛函數(shù)  
  2.  
  3. if ( rabbit *p = dynamic_case<Animal*>(obj))     
  4. {     
  5.    p->jump();     
  6. }     
  7. //我們還可以通過typeid萃取到對象的型別信息,比如對象的名稱   
  8. std::cout << typeid(obj).name() << std::endl   

Qt拓展了C++的內(nèi)省機制,(實際上,它并沒有采用c++的RTTI),而是提供了更為強大的元對象(meta object)機制,來實現(xiàn)內(nèi)省。接下來,就讓我們看看,Qt是如何擴展c++內(nèi)省機制的。

要深刻理解Qt的內(nèi)省機制,首先理解QObject,QObject類是整個Qt對象模型的心臟,Qt對象模型最為核心的功能是提供一種無縫的對象通訊機制,即就是我們所熟知的信號和槽。QObject主要有三大職責: 內(nèi)存管理、內(nèi)省(intropection)與事件處理。本文將集中在在內(nèi)省的討論。以下代碼介紹了QObject類提供的內(nèi)省方法: 

  1. //每個對象可以通過QObject::setObjectName()和QObject::objectName()設置、取得類的實例的名字   
  2. FirstQtApp obj;    
  3. obj.setObjectName("instanceName");    
  4. QString name1 = obj.objectName();   // return instanceName   
  5. //每個對象還可以通過它的元對象className方法得到類的名字   
  6. QString name2 = obj.metaObject()->className();  // return FirtstQtApp   
  7. //每個對象可以通過QObject::inherits方法來查詢是否對前對象類派生于量一個類   
  8. bool isherited =  obj.inherits("QObject");         // returns true   
  9. isherited =  obj.inherits("QWideget");         // returns true  

讓我們再來一下QObject::inherits方法的底層實現(xiàn):

  1. inline bool inherits(const char *classname) const   
  2.     { return const_cast<QObject *>(this)->qt_metacast(classname) != 0; }  

原來,QObject::inherits是通過qt_metacast()這個虛函數(shù)實現(xiàn)的, 事實上每個QObject的派生類都必須實現(xiàn)metaObject()以及其他qt_metacall()方法,從而滿足自省方法className, inherits等方法的調(diào)用(當然還有其他用途)。

而所有有關派生從QObject的子類中的內(nèi)省方法無須有用戶實現(xiàn),用戶只要在類中聲明宏Q_OBJECT即可,Qt的元對象編譯器(moc)負責實現(xiàn)派生從QObject的子類中的內(nèi)省方法。

  1. // defined at ..\Qt\src\corelib\kernel\qobjectdefs.h   
  2. /* tmake ignore Q_OBJECT */   
  3. #define Q_OBJECT \   
  4. public: \     
  5.     Q_OBJECT_CHECK \     
  6. static const QMetaObject staticMetaObject; \     
  7.     Q_OBJECT_GETSTATICMETAOBJECT \     
  8. virtual const QMetaObject *metaObject() const; \     
  9. virtual void *qt_metacast(const char *); \     
  10.     QT_TR_FUNCTIONS \     
  11. virtual int qt_metacall(QMetaObject::Call, int, void **); \  

此外,所有的Qt widgets類均繼承自QObject, QObject所提供的isWidgetType自省方法可以很方便讓QObject子對象查詢自己是否是wideget, 而且它會比 qobject_cast<QWidget *>(obj) 或者 obj->inherits快很多。原因qobject_cast()t和inherits()都是借助元對象系統(tǒng)來實現(xiàn)其功能的,isWidgetType()是QObject本身的標志位得以實現(xiàn)。

更多自省方法定義在QMetaObject,以下是QMetaObject聲明的源代碼:

  1. struct Q_CORE_EXPORT QMetaObject     
  2. {     
  3. const char *className() const;     
  4. const QMetaObject *superClass() const;     
  5.     QObject *cast(QObject *obj) const;     
  6.  
  7.     ....     
  8. int methodOffset() const;     
  9. int enumeratorOffset() const;     
  10. int propertyOffset() const;     
  11. int classInfoOffset() const;     
  12. int constructorCount() const;     
  13. int methodCount() const;     
  14. int enumeratorCount() const;     
  15. int propertyCount() const;     
  16. int classInfoCount() const;     
  17. int indexOfConstructor(const char *constructor) const;     
  18. int indexOfMethod(const char *method) const;     
  19. int indexOfSignal(const char *signal) const;     
  20. int indexOfSlot(const char *slot) const;     
  21. int indexOfEnumerator(const char *name) const;     
  22. int indexOfProperty(const char *name) const;     
  23. int indexOfClassInfo(const char *name) const;     
  24.     ...     
  25. }   

上述方法主要是實現(xiàn)對元對象表的訪問及其操作,對元對象表(由moc實現(xiàn))實例如下所示:

  1. // defined at ..\Qt\src\corelib\kernel\qobjectdefs.h   
  2. /* tmake ignore Q_OBJECT */   
  3. #define Q_OBJECT \   
  4. public: \    
  5.     Q_OBJECT_CHECK \    
  6. static const QMetaObject staticMetaObject; \    
  7.     Q_OBJECT_GETSTATICMETAOBJECT \    
  8. virtual const QMetaObject *metaObject() const; \    
  9. virtual void *qt_metacast(const char *); \    
  10.     QT_TR_FUNCTIONS \    
  11. virtual int qt_metacall(QMetaObject::Call, int, void **); \   

總結:

1、Qt是通過QObject、QMetaObject類實現(xiàn)其內(nèi)省機制,

2、QObject暴露給用戶的共有自省方法有objectName(), inherits(), isWidgetType()等

3、大多數(shù)自省方法是QObject派發(fā)給QMetaObject實現(xiàn) (e.g. QMetaObject::className,),元對象模型編譯器moc負責自省方法的實現(xiàn)

4、更多自省方法定義在QMetaObject,而是為了等信號槽通訊、事件派發(fā)等機制,

小結:關于解析 Qt 內(nèi)省機制剖析的內(nèi)容介紹完了,希望本文對你有所幫助!

責任編輯:zhaolei 來源: 互聯(lián)網(wǎng)
相關推薦

2011-08-02 18:07:03

iPhone 內(nèi)省 Cocoa

2011-06-22 16:50:09

Qt 進程 通信機制

2011-02-28 09:51:43

內(nèi)省

2009-07-14 18:09:08

Jython的內(nèi)省

2011-06-23 14:40:13

Qt 信號

2011-06-23 14:05:32

Qt 事件機制

2011-06-09 17:26:17

Qt 插件 API

2011-06-08 15:27:24

QT QT 4.5 編譯

2011-06-09 15:18:07

QT 編譯

2011-09-09 17:59:26

QT Widget

2011-07-05 18:40:19

QT 信號 機制

2011-07-01 14:20:59

Qt 事件

2011-07-01 14:14:34

Qt 事件

2011-06-09 09:45:35

Linux QT 信號

2011-07-05 18:32:52

QT 信號 機制

2011-06-23 15:32:05

Qt Windows消息

2011-06-22 15:50:45

QT 線程

2011-07-01 14:39:08

Qt Quick

2011-06-27 09:15:21

QT Creator

2011-06-29 17:20:20

Qt 內(nèi)存 QOBJECT
點贊
收藏

51CTO技術棧公眾號

久久精品国产69国产精品亚洲 | 成人天堂av| 欧美a级片网站| 欧美福利视频在线观看| 成年女人在线看片| 欧美精品一二三区| 巨骚激情综合| 欧美日韩亚洲网| 色老板视频在线观看| 国产精品高清亚洲| 50路60路老熟妇啪啪| 成人深夜在线观看| 青青草原网站在线观看| 日本sm残虐另类| 欧美日韩免费观看一区| 99热这里只有精品8| 国产福利不卡| 亚洲激情在线| 欧美日韩另类综合| 麻豆一区二区三区| 国内自拍中文字幕| 成人免费毛片aaaaa**| 9久久9毛片又大又硬又粗| 成人av电影在线网| 波多野结衣家庭教师视频| 99久久精品费精品国产一区二区| 国产 欧美 日韩 一区| 国产精品系列在线播放| 特级西西444| xf在线a精品一区二区视频网站| 精品少妇一区二区三区在线| 91免费视频大全| 男人插曲女人视频免费| 亚洲精品大片www| 伊大人久久香线焦宗合一75大| 色综合天天狠狠| 在线欧美三级| 一本久久综合亚洲鲁鲁| 国产亚洲观看| 国产精品女视频| 日韩午夜av在线| 亚洲精品天堂成人片av在线播放 | 欧美日韩国产成人| 日韩成人午夜| 亚洲一区二区免费| 久久成人免费| 2022中文字幕| 日韩理论片网站| 日本在线视频1区| 91黄色在线观看| 欧美videossex另类| 这里只有精品久久| 先锋影音国产精品| 国产欧美一区二区在线播放| 精彩视频一区二区三区| 热久久精品免费视频| 欧美午夜久久久| 欧美在线极品| 日本a级片电影一区二区| 精品动漫av| 老太脱裤子让老头玩xxxxx| 一区二区三区四区激情| 日本在线视频网址| 69国产精品成人在线播放| 亚洲精品一级| 黑人糟蹋人妻hd中文字幕| 狠狠色狠色综合曰曰| 小草在线视频免费播放| 国产精品88a∨| 精品亚洲成a人| 满满都是荷尔蒙韩剧在线观看| 精品奇米国产一区二区三区| 国产欧美三级电影| 欧美久久久久久久| 亚洲免费电影在线| 激情开心成人网| 国产精品嫩草在线观看| 久久蜜臀中文字幕| 黄视频网站在线| 日韩av手机在线观看| 国产精品亚洲第一区在线暖暖韩国| 极品粉嫩饱满一线天在线| 在线观看欧美www| 激情婷婷久久| 超清福利视频| 色视频www在线播放国产成人| 激情欧美亚洲| www.1024| 一区二区三区视频在线| 在线欧美日韩| 日韩男人天堂| 久久影视免费观看| 久久成人羞羞网站| 91精彩视频在线播放| 国产成人精品久久久| 成人av电影在线播放| 成人福利网站| 91一区二区三区| 亚洲欧美一区二区久久| 亚洲伦理网站| 三年中国中文在线观看免费播放 | 伊人成综合网| 天天综合网日韩| 亚洲美女www午夜| 欧美三级午夜理伦三级中文幕| 日韩av播放器| 日韩中文字幕视频在线| 麻豆精品在线观看| 激情影院在线观看| 国产欧美一区二区视频| 大伊人狠狠躁夜夜躁av一区| 欧美1区2区3区4区| 成年人小视频网站| 久久香蕉国产线看观看av| 免费观看在线综合色| 香蕉97视频观看在线观看| 欧美激情二区三区| 2021国产精品久久精品| 久久天堂av| 中国成人在线视频| 精品对白一区国产伦| 久久看片网站| 91极品在线| 日本成人看片网址| 日韩午夜激情av| 亚洲欧美日韩国产一区二区| 国产原创av在线| 粉嫩精品一区二区三区在线观看| 亚洲va在线va天堂| 日韩欧美中字| 青青草视频在线免费观看| 91精品视频免费| 欧美日韩美女在线观看| 三级电影一区| 一二三中文字幕在线| 91丨九色丨国产在线| 色94色欧美sute亚洲线路二| 牛牛国产精品| 巨大荫蒂视频欧美另类大| 精品一区二区不卡| 精品精品国产高清a毛片牛牛 | av电影免费在线观看| 久久综合一区| 欧美xxxxx牲另类人与| 久久99久久精品| 美女的胸无遮挡在线观看| 中文精品视频一区二区在线观看| 精品国产3级a| 成人综合在线视频| 亚洲一区二区三区免费| free性欧美1819hd| 成人日韩av在线| 欧美人xxxx| 国模少妇一区二区三区| 国产成人a视频高清在线观看| 日本成人中文字幕在线| 国产成人精品一区二区三区| 欧美日韩午夜视频在线观看| 日韩视频一区| 91福利在线尤物| 男人操女人免费| 国产精品久久久久久久久久三级 | 国产精品少妇在线视频| 久久久久久久久综合| 一区二区三区高清在线| 久久久人成影片免费观看| 裸体裸乳免费看| 91丨九色丨国产在线| 亚洲乱码av中文一区二区| av一二三不卡影片| 精东粉嫩av免费一区二区三区| 51精品秘密在线观看| 亚洲国产精品日韩专区av有中文| 99中文字幕一区| 亚洲精品高清国产一线久久| 中文字幕亚洲图片| 一区二区三区在线视频播放| 午夜欧美精品| 日本在线影院| 国产三级视频| 日本三级中国三级99人妇网站| 中文字幕欧美日韩| 亚洲地区一二三色| 久久精品理论片| 欧美高清视频看片在线观看| 欧美日韩国产第一页| 国产精品黄色在线观看| 红桃视频亚洲| 日本黄色成人| 色吊丝在线永久观看最新版本| 一区二区在线高清视频| 97色在线视频| 精品国产乱码久久| 一区二区三区在线视频免费| 免费观看在线综合色| 国产成人精品999在线观看| 久久久水蜜桃| 欧美亚洲一级二级| baoyu777.永久免费视频| 中文字幕日韩精品一区二区|