青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 30  文章 - 67  trackbacks - 0
<2013年7月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

常用鏈接

留言簿(8)

隨筆分類

隨筆檔案

文章檔案

收藏夾

Oops

搜索

  •  

積分與排名

  • 積分 - 86615
  • 排名 - 278

最新評論

閱讀排行榜

評論排行榜

簡介

本文主要講解Qt是如何實現反射,以及一點點反射使用的小心得。

文章概覽

Qt反射內幕小窺

詳細內容

反射前期準備

得到注冊的類成員變量

得到注冊的類成員函數

訪問類成員屬性(get,set)

調用注冊的函數

反射應用

總結

Qt反射內幕小窺

Qt反射機制是基于moc(meta object compiler)實現的,在這里多插一句(可以說Qt所有C++沒有的特性,幾乎都和這個有關系)。但是需要注意的是Qt提供的反射式基本的反射,不支持類的反射,這個與Java,C#還是有差別的。

moc講解

通常C++的編譯過程為

預處理->編譯->鏈接->運行

Qt編譯的過程中,有一個moc的過程,在Qt工程構建過程中的qmake其實就是干這個事的。moc->預處理->編譯->鏈接->運行。

在moc過程中,需要處理的事情如下:

1、 識別一些特殊的宏Q_OBJECT、Q_PROPERTY、Q_INVOKABLE。。。; 如果碰到這些關鍵字,Qt自然就會去生成對應的moc文件。

2、 slot,signal自然也是如此。

3、 uidesigner,同樣也是在這個階段處理的;

詳細內容

 

反射前期準備

1、 首先得繼承于Q_Object,同時需要在class中加入Q_OBJECT,但是Q_Object的構造函數默認是私有的不讓繼承。

在類中直接使用Q_GADGET也可以實現反射,。。。據說只能實現部分功能,目前我只實現到能遍歷成員屬性,函數,但是不能訪問其中的值。

這個過程其實就是定義QMetaObject的過程,具體見Qt源碼

2、 注冊類成員變量需要使用Q_PROPERTY

Q_PROPERTY( type member READ get WRITE set) 其中READ,WRITE是關鍵字

Type表示成員的類型(不支持自定義類型,對Qt很多基本類型都支持);

Member代表你給該成員另外起的名字,可以和變量名不同;get,set就是自己在C++函數里面定義的基本的訪問函數名,不需要寫參數。直接上代碼:

3、 注冊類成員函數

如果你希望這個函數能夠被反射,那么很簡單,只需要在類的函數聲明前加入Q_INVOKABLE關鍵字。

例如Q_INVOKABLE int func( QString flag );

   #include <QObject>
   class MyClass : public QObject
   {
    Q_OBJECT
    Q_PROPERTY(int Member1 READ Member1 WRITE setMember1 )
    Q_PROPERTY(int Member2 READ Member2 WRITE setMember2 )
    Q_PROPERTY(QString MEMBER3 READ Member3 WRITE setMember3 )
   public:
    explicit MyClass(QObject *parent = 0);
   signals:
   public slots:
   public:
    Q_INVOKABLE int Member1();
    Q_INVOKABLE int Member2();
    Q_INVOKABLE QString Member3();
    Q_INVOKABLE void setMember1( int mem1 );
    Q_INVOKABLE void setMember2( int mem2 );
    Q_INVOKABLE void setMember3( const QString& mem3 );
    Q_INVOKABLE int func( QString flag );
   private:
    int m_member1;
    int m_member2;
    QString m_member3;
   };

得到注冊的類成員變量

  MyClass theObj;
 const QMetaObject* metaObj = theObj.metaObject();
 //1.遍歷類的屬性
 int propertyCnt = metaObj->propertyCount();
 for ( int i = 0; i < propertyCnt; ++ i )
 {
 QMetaProperty oneProperty = metaObj->property( i );
 cout << " name: " << oneProperty.name();
 cout << " type: " << QVariant::typeToName( oneProperty.type()) << "\n";
  }

主要思路就是得到其元對象,得到其元屬性,然后就能得到你需要的信息,具體的訪問函數有name,type,需要注意的是得到的type是枚舉值,還在Qt提供了typeToName的函數,你可以得到想要的(例如不是空洞的2,而是”int”)。

得到注冊的類成員函數

//2.遍歷類的函數成員
 int methodCnt = metaObj->methodCount();
 for ( int idx = 0; idx < methodCnt; ++ idx )
 {
 QMetaMethod oneMethod = metaObj->method( idx );
 cout << "--------begin-------" << "\n";
 cout << " typeName: " << oneMethod.typeName() << "\n";
 cout << " signature: " << oneMethod.signature() << "\n";
 cout << " methodType: " << oneMethod.methodType() << "\n";
 cout << "--------end---------" << "\n";
  }

和遍歷類屬性一致,其實就是根據元對象,得到元函數;

其中typeName代表返回類型,signature只的是函數的原貌,methodType代表函數的類型,在Qt中分為三類(槽,信號,普通函數)。

訪問類成員屬性(get,set)

//3.使用反射
 cout << "-------test property-----------" << "\n";
 MyClass newObj;
 newObj.setProperty("Member1", 66);
 cout << newObj.property( "Member1" ).toString().toStdString() << "\n";
 cout << newObj.Member1() << "\n";
 cout << "--------end----------" << "\n";

在這里使用的是QObject的property() 和setProperty方法,來訪問成員信息。但是對于使用Q_GADGET宏的類,是不能使用這個方法的,還在尋找解決方法,基本思路當然是重寫。

調用注冊的函數

  int ret;
  MyClass newObj;
 newObj.setMember1( 20 );
 newObj.setMember2( 50 );
 QMetaObject::invokeMethod( &newObj, "func", Qt::DirectConnection,
 Q_RETURN_ARG(int, ret ),
 Q_ARG(QString, "+"));

//普通函數的調用

在MyClass中,我們定義了int func( QString flag );這個函數,利用反射的調用方式如上,主要是理解invokeMethod的用法,其中Qt::DirectConnection是函數的執行方式,分為(異步和同步),Q_RETURN_ARG是返回參數,Q_ARG是傳入參數,需要按函數聲明中參數的順序依次傳入,Qt最多支持9個參數,對于一般的應用沒有問題。還有疑問,請移步具見Qt強大的幫助文檔。

反射的應用

反射反射,就我目前的認知水平來看,通過使用字符串,來實現函數的通用化調用,例如你可以利用反射把很多函數放置到數組中,實現一次遍歷,全部調用。

目前我見到的大多是利用反射來操作數據庫,例如hibernate,其實可以利用Qt的反射,快速實現所謂的hibernate,(最近自己獨立實現了一套,很方便)。

總結

這篇文章主要講了如何使用Qt來實現反射,在實用角度上來講,我們不需要了解Qt是怎么實現反射的,對于怎么用上面說的很清楚了。大家有什么的新的想法,希望能提出來,來電請咨詢
<levard@gmail.com>

posted on 2013-07-13 22:19 Cunch 閱讀(14480) 評論(1)  編輯 收藏 引用 所屬分類: C++ 、Qt

FeedBack:
# re: Qt反射 2013-07-17 17:01 tb
發射總結不出  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              亚洲欧洲日韩在线| 精品91在线| 久久精品官网| 亚洲主播在线观看| 亚洲欧美日韩国产综合在线| 亚洲午夜精品久久久久久app| 9色精品在线| 在线一区二区三区四区五区| 亚洲一区国产| 欧美在线视频一区| 久久婷婷国产综合精品青草| 亚洲无限乱码一二三四麻| 久久理论片午夜琪琪电影网| 免费不卡在线观看av| 亚洲国产精品视频一区| 日韩视频在线免费观看| 亚洲欧美在线观看| 美日韩精品视频免费看| 欧美日韩免费观看一区三区| 国产视频精品xxxx| 亚洲欧洲精品一区二区精品久久久| 日韩一级在线| 欧美一区二区在线免费播放| 久久久亚洲欧洲日产国码αv| 亚洲国产成人不卡| 亚洲一区影音先锋| 欧美激情精品久久久久久蜜臀| 欧美精品久久99| 狠狠色狠狠色综合日日小说| 亚洲天堂网在线观看| 欧美.日韩.国产.一区.二区| 亚洲午夜久久久久久尤物| 乱人伦精品视频在线观看| 国产精品主播| 亚洲婷婷免费| 亚洲日本中文字幕免费在线不卡| 久久精品国产一区二区三| 欧美亚男人的天堂| 亚洲精选中文字幕| 免费成人毛片| 久久久精品性| 国产伦精品一区二区三区高清版 | 国产精品xxxav免费视频| 一区二区在线观看av| 欧美一区二区| 99国产精品| 欧美—级a级欧美特级ar全黄| 黄色欧美日韩| 欧美一级专区免费大片| 一本高清dvd不卡在线观看| 欧美暴力喷水在线| 伊大人香蕉综合8在线视| 久久国产精品99久久久久久老狼| 日韩亚洲一区在线播放| 欧美精品情趣视频| 99ri日韩精品视频| 亚洲区一区二区三区| 欧美成人日本| 亚洲精品美女久久久久| 亚洲大胆人体在线| 免费观看日韩| 亚洲激情小视频| 欧美二区在线播放| 免费91麻豆精品国产自产在线观看| 国内一区二区三区在线视频| 久久精品视频va| 久久精品国产一区二区三| 亚洲女爱视频在线| 国产精品私房写真福利视频 | 欧美日韩高清在线一区| 亚洲高清激情| 亚洲国产激情| 欧美剧在线观看| 亚洲人成啪啪网站| 亚洲高清久久网| 欧美黄色网络| 亚洲精品视频在线观看网站 | 欧美亚洲综合在线| 亚洲一区三区电影在线观看| 国产视频久久网| 久热精品视频| 欧美国产日韩一区二区三区| 日韩亚洲欧美高清| 亚洲小说春色综合另类电影| 国产亚洲精品激情久久| 欧美成人情趣视频| 久久久人成影片一区二区三区观看 | 欧美黑人一区二区三区| 欧美激情一二区| 性色av一区二区三区在线观看| 香蕉久久夜色精品国产| 91久久久亚洲精品| 亚洲深夜福利在线| 在线看片成人| 亚洲视频在线观看| 亚洲国产精品一区二区久| 一区二区高清在线观看| 国产一区二区三区直播精品电影| 欧美丰满少妇xxxbbb| 欧美日韩一卡| 久久久精品日韩欧美| 欧美精品久久一区| 欧美一区三区三区高中清蜜桃| 久久久欧美一区二区| 日韩一级二级三级| 久久乐国产精品| 亚洲一区尤物| 欧美大片在线看免费观看| 午夜精品久久| 欧美黄色小视频| 久久久999成人| 欧美日韩中文字幕日韩欧美| 久久久人成影片一区二区三区| 欧美经典一区二区三区| 亚洲欧美资源在线| 美日韩精品免费观看视频| 久久精品国产综合精品| 欧美性淫爽ww久久久久无| 欧美高清在线一区二区| 国产精品久久一级| 一区二区冒白浆视频| 欧美一级淫片aaaaaaa视频| 亚洲人成亚洲人成在线观看| 午夜精品久久久久久| 中文在线资源观看视频网站免费不卡| 午夜精品av| 亚洲一区免费看| 欧美日韩美女一区二区| 欧美成在线观看| 黄色免费成人| 性色av香蕉一区二区| 亚洲欧美综合| 国产精品视频xxxx| 99亚洲伊人久久精品影院红桃| 亚洲看片网站| 欧美经典一区二区三区| 欧美激情一区二区三区四区| 亚洲人成啪啪网站| 欧美va天堂| 亚洲国产日韩美| 亚洲国产精品视频| 久久久久久久综合色一本| 欧美影片第一页| 国产精品成人一区二区艾草| 亚洲精品国产精品国自产观看浪潮| 在线视频国产日韩| 性欧美video另类hd性玩具| 亚洲欧美日韩成人高清在线一区| 免费在线日韩av| 欧美国产日本高清在线| 亚洲激情影视| 欧美日韩三级| 亚洲综合三区| 蜜桃av一区二区在线观看| 亚洲国产视频一区二区| 欧美激情在线| 亚洲网站啪啪| 老巨人导航500精品| 亚洲国产成人久久| 欧美国产日韩免费| 亚洲少妇一区| 久久久91精品国产| 亚洲人成欧美中文字幕| 国产精品v欧美精品v日韩精品| 性视频1819p久久| 亚洲福利视频二区| 性感少妇一区| 极品少妇一区二区三区| 欧美精品在线观看91| 亚洲欧美日韩在线观看a三区| 久久天天狠狠| 亚洲国产高清aⅴ视频| 欧美午夜视频一区二区| 久久福利视频导航| 亚洲丰满少妇videoshd| 亚洲欧美日韩爽爽影院| …久久精品99久久香蕉国产 | 日韩一级黄色大片| 久久福利一区| av72成人在线| 激情综合中文娱乐网| 国产精品久久久久免费a∨大胸| 久久人人爽人人| 亚洲一区二区视频| 亚洲国产小视频在线观看| 久久精品亚洲一区二区| 中国女人久久久| 影音先锋日韩精品| 国外视频精品毛片| 香蕉成人伊视频在线观看 | 亚洲午夜日本在线观看| 国产一区二区三区成人欧美日韩在线观看 | 欧美3dxxxxhd| 欧美中文字幕第一页| 99国产精品久久久久久久| 一区二区三区中文在线观看| 欧美日韩综合另类| 欧美大片免费| 久久久午夜精品| 性一交一乱一区二区洋洋av|