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

posts - 319, comments - 22, trackbacks - 0, articles - 11
  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

Q_INVOKABLE與invokeMethod用法全解

Posted on 2011-08-05 07:19 RTY 閱讀(1864) 評論(0)  編輯 收藏 引用 所屬分類: Qt

請尊重原創(chuàng)作品和譯文。轉(zhuǎn)載請保持文章完整性,并以超鏈接形式注明原始作者地址http://blog.csdn.net/changsheng230,方便其他朋友提問和指正。

 

Qt/Qt Quick宏淺議一文中,我們將介紹Qt中經(jīng)常使用的幾個宏: Q_OBJECT, SIGNAL與SLOT, Q_SIGNALS 與 Q_SLOTS, Q_EMIT ,Q_INVOKABLE, Q_PROPERTY。相比其他宏,Q_INVOKABLE 顯得更加神秘,但Q_INVOKABLE的理解與使用變得越來越重要。本文將圍繞Q_INVOKABLE以及相對應(yīng)的invokeMethod展開討論。

Q_INVOKABLE

#define Q_INVOKABLE

重新回顧一下Q_INVOKABLE的定義,它在$QTDIR/src/corelib/kernel/qobjectdefs.h 中,簡單被define,目的在于讓moc識別。

使用Q_INVOKABLE來修飾成員函數(shù),目的在于被修飾的成員函數(shù)能夠被元對象系統(tǒng)所喚起。

QMetaObject::invokeMethod

靜態(tài)方法QMetaObject::invokeMethod() 的定義如下:

     

    1. bool QMetaObject::invokeMethod ( QObject * obj, const char * member,Qt::ConnectionType type,  
    2. QGenericReturnArgument ret, QGenericArgument val0 = QGenericArgument( 0 ), …)  
     

     

     

invokeMethod的用法為,嘗試調(diào)用對象obj的方法member(注意member可以為信號或者是槽),如何member可以被調(diào)用,則返回真,否則返回假。QMetaObject::invokeMethod可以是異步調(diào)用,也可以是同步調(diào)用。這取決與它的連接方式Qt::ConnectionType type。如果type為Qt::DirectConnection,則為同步調(diào)用,若為Qt::QueuedConnection,則為異步調(diào)用。例如:

     

    1. QMetaObject::invokeMethod(object, "methodName",   
    2. Qt::QueuedConnection,   
    3. Q_ARG(type1, arg1),   
    4. Q_ARG(type2, arg2));  
     

     

上述調(diào)用為異步調(diào)用。請注意,因?yàn)樯厦嫠镜膮?shù)需要被在構(gòu)建事件時進(jìn)行硬拷貝,參數(shù)的自定義型別所對應(yīng)的類需要提供一個共有的構(gòu)造函數(shù)、析構(gòu)函數(shù)以及拷貝構(gòu)造函數(shù)。而且必須使用注冊Qt型別系統(tǒng)所提供的qRegisterMetaType() 方法來注冊這一自定義型別。

Q_INVOKABLE與QMetaObject::invokeMethod均由元對象系統(tǒng)喚起。這一機(jī)制在Qt C++/QML混合編程跨線程編程Qt Service Framework 以及 Qt/ HTML5混合編程以及里廣泛使用。

Qt C++/QML混合編程

QML中調(diào)用C++方法借助了Qt元對象系統(tǒng)。考慮在QML中使用Qt C++定義的方法,如下代碼所示:

 

  1. import Qt 4.7   
  2. import Shapes 5.0   //自定義模塊  
  3. Item {   
  4.     width: 300; height: 200  
  5.     Ellipse {   
  6.          x: 50; y: 35; width: 200; height: 100   
  7.         color: "blue"   
  8.          MouseArea {   
  9.             anchors.fill: parent  
  10.             // 調(diào)用C++中定義的randomColor方法   
  11.             onClicked: parent.color = parent.randomColor()    
  12.         }   
  13.     }  
  14. }  
 

 

為了讓上述QML代碼成功的調(diào)用下面這段代碼定義的randomColor()函數(shù),最為關(guān)鍵的一點(diǎn)見randomColor方法用Q_INVOKABLE 修飾。

 

  1. #include <QDeclarativeItem >  
  2. class EllipseItem : public QDeclarativeItem   
  3. {   
  4.     Q_OBJECT   
  5. public:  
  6.       Q_INVOKABLE QColor randomColor() const;  
  7.       …  
  8. }  
 

 

更多細(xì)節(jié),請參看我的另一篇博文:QML與C++混合編程使用

在跨線程編程中的使用

我們?nèi)绾握{(diào)用駐足在其他線程里的QObject方法呢?Qt提供了一種非常友好而且干凈的解決方案:向事件隊(duì)列post一個事件,事件的處理將以調(diào)用我們所感興趣的方法為主(當(dāng)然這需要線程有一個正在運(yùn)行的事件循環(huán))。而觸發(fā)機(jī)制的實(shí)現(xiàn)是由moc提供的內(nèi)省方法實(shí)現(xiàn)的。因此,只有信號、槽以及被標(biāo)記成Q_INVOKABLE的方法才能夠被其它線程所觸發(fā)調(diào)用。如果你不想通過跨線程的信號、槽這一方法來實(shí)現(xiàn)調(diào)用駐足在其他線程里的QObject方法。另一選擇就是將方法聲明為Q_INVOKABLE,并且在另一線程中用invokeMethod喚起。

 

更多細(xì)節(jié),譯文事件循環(huán)與線程

Qt Service Framework

Qt服務(wù)框架是Qt Mobility 1.0.2版本推出的,一個服務(wù)(service)是一個獨(dú)立的組件提供給客戶端(client)定義好的操作。客戶端可以通過服務(wù)的名稱,版本號和服務(wù)的對象提供的接口來查找服務(wù)。 查找到服務(wù)后,框架啟動服務(wù)并返回一個指針。

服務(wù)通過插件(plug-ins)來實(shí)現(xiàn)。為了避免客戶端依賴某個具體的庫,服務(wù)必須繼承自QObject。這樣QMetaObject 系統(tǒng)可以用來提供動態(tài)發(fā)現(xiàn)和喚醒服務(wù)的能力。要使QmetaObject機(jī)制充分的工作,服務(wù)必須滿足,其所有的方法都是通過 signal,slot,property 或invokable methodQ_INVOKEBLE來實(shí)現(xiàn)

其中,最常見的與servicer交互的方法如下:

  1. QServiceManager manager;QObject *storage ;  
  2. storage = manager.loadInterface("com.nokia.qt.examples.FileStorage"); if (storage)     QMetaObject::invokeMethod(storage, "deleteFile", Q_ARG(QString, "/tmp/readme.txt"));  
上面的代碼通過service的元對象提供的invokeMethod方法,調(diào)用文件存儲對象的deleteFile() 方法。客戶端不需要知道對象的類型,因此也沒有鏈接到具體的service庫。  當(dāng)然在服務(wù)端的deleteFile方法,一定要被標(biāo)記為Q_INVOKEBLE,才能夠被元對象系統(tǒng)識別

Qt服務(wù)框架的一個亮點(diǎn)是它支持跨進(jìn)程通信,服務(wù)可以接受遠(yuǎn)程進(jìn)程。在服務(wù)管理器上注冊后 進(jìn)程通過signal,slot,invokable method和property來通信,就像本地對象一樣。服務(wù)可以設(shè)定為在客戶端間共享,或針對一個客戶端。  請注意,在Qt服務(wù)框架推出之前,信號、槽以及invokable method僅支持跨線程。 下圖是跨進(jìn)成的服務(wù)/客戶段通信示意圖(圖片來自諾基亞論壇)。這里我們可以清楚的看到,invokable methodQ_INVOKEBLE 是跨進(jìn)城、跨線程對象之間通信的重要利器。

 

serivceFramework

有關(guān)Qt Service Framework的更多討論和用例,請參見Qt Service Framework文檔

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            99视频在线精品国自产拍免费观看| 欧美午夜不卡在线观看免费 | 亚洲永久精品大片| 亚洲国产成人精品久久久国产成人一区| 亚洲综合色婷婷| 午夜精品福利在线观看| 久久黄色小说| 久久男女视频| 欧美激情在线狂野欧美精品| 亚洲黄色片网站| 99精品福利视频| 欧美在线看片| 麻豆精品视频在线观看| 欧美激情精品久久久久久黑人| 欧美精品在线一区| 国产九九精品| 亚洲人成网站777色婷婷| 一区二区三区 在线观看视| 午夜精品一区二区三区电影天堂| 久久综合久色欧美综合狠狠 | 亚洲精品五月天| 亚洲免费视频网站| 美女黄网久久| 国产日韩一区二区| 日韩午夜电影| 久久人人看视频| 日韩写真视频在线观看| 久久久www成人免费毛片麻豆| 欧美日韩午夜剧场| 在线精品国精品国产尤物884a| 亚洲视频在线观看网站| 蜜臀久久99精品久久久久久9| 亚洲视频在线观看视频| 免费成人激情视频| 国产中文一区二区| 亚洲欧美日韩第一区| 久久九九99| 91久久精品国产| 欧美一二三视频| 欧美日韩福利| 亚洲二区精品| 久久精品男女| 亚洲一区精品电影| 欧美日韩精品免费| 亚洲第一页自拍| 久久全球大尺度高清视频| 亚洲欧美久久| 国产精品视频一区二区高潮| 亚洲网站啪啪| 亚洲精选成人| 欧美国产日韩一区二区在线观看| 经典三级久久| 久久综合九九| 久久躁狠狠躁夜夜爽| 国色天香一区二区| 久久精品五月婷婷| 欧美一区二区视频观看视频| 国产精品一区在线观看你懂的| 亚洲一区欧美一区| 99视频在线精品国自产拍免费观看| 欧美精品一区二区久久婷婷| 亚洲精品美女久久7777777| 女人色偷偷aa久久天堂| 久久久噜噜噜久久人人看| 激情六月综合| 欧美大片一区二区三区| 美日韩丰满少妇在线观看| 亚洲人成网站色ww在线| 亚洲激情精品| 欧美日韩在线一区| 午夜国产精品视频| 一本高清dvd不卡在线观看| 欧美性猛交一区二区三区精品| 亚洲综合视频网| 性娇小13――14欧美| 黄色成人在线网站| 欧美激情第9页| 欧美日韩综合在线免费观看| 亚洲欧美激情在线视频| 欧美在线免费播放| 亚洲人成亚洲人成在线观看图片| 日韩视频专区| 国产日本欧美一区二区| 久久伊伊香蕉| 免费高清在线视频一区·| 日韩一区二区免费看| 日韩视频久久| 国产精品毛片大码女人| 久久综合色8888| 欧美日韩视频一区二区三区| 久久成人精品| 久久综合久久88| 亚洲女性喷水在线观看一区| 久久久久久久久久久久久女国产乱 | 久久综合色88| 亚洲精品日韩一| 亚洲美女视频| 国产日韩亚洲欧美综合| 亚洲国产高清自拍| 国产精品久久久久999| 欧美jizzhd精品欧美喷水| 国产精品狠色婷| 女人香蕉久久**毛片精品| 国产精品激情| 欧美激情乱人伦| 国产精品香蕉在线观看| 模特精品在线| 国产精品一区二区a| 亚洲日本电影在线| 狠狠做深爱婷婷久久综合一区| 女人色偷偷aa久久天堂| 国产精品hd| 亚洲精品视频在线观看免费| 激情久久综合| 欧美中文字幕在线观看| 亚洲欧美中文日韩在线| 欧美片网站免费| 欧美高清在线视频观看不卡| 国产亚洲一级| 亚洲欧美中文日韩在线| 亚洲一区日韩在线| 欧美日韩国产影片| 亚洲国产你懂的| 亚洲国产高潮在线观看| 欧美一区二区三区另类 | 亚洲精品中文字幕在线| 久久精品国产久精国产一老狼| 国产精品99久久99久久久二8| 蜜臀久久久99精品久久久久久| 久久嫩草精品久久久精品| 国产视频自拍一区| 亚洲欧美日韩国产一区| 亚洲欧美在线播放| 欧美日韩国产综合网| 亚洲欧洲精品一区二区三区不卡 | 亚洲精品美女久久久久| 狠狠色香婷婷久久亚洲精品 | 久久久久久久综合| 久久久久一区二区三区| 国产午夜精品理论片a级大结局 | 久久精品国产欧美激情 | 亚洲一区亚洲| 亚洲在线第一页| 欧美中文字幕久久| 欧美日韩人人澡狠狠躁视频| 亚洲成色777777女色窝| 尹人成人综合网| 久久国产精品亚洲va麻豆| 久久久精品性| 黄网站免费久久| 欧美一区二区啪啪| 久久综合色影院| 亚洲人www| 欧美高清在线一区二区| 久久亚洲综合网| 亚洲国产高清一区| 99精品视频免费在线观看| 欧美日韩和欧美的一区二区| 亚洲在线一区| 久久精品国产欧美激情| 亚洲黄色一区二区三区| 欧美片在线播放| 夜夜嗨av一区二区三区网页| 亚洲在线观看免费| 国产日韩欧美在线| 麻豆成人精品| 一本色道久久综合狠狠躁篇怎么玩| 亚洲永久免费精品| 国产亚洲欧美一区在线观看| 久久久www成人免费精品| 亚洲电影专区| 午夜精品久久久久久久男人的天堂 | 午夜精品视频一区| 海角社区69精品视频| 欧美大片在线看免费观看| 亚洲一区二区欧美| 欧美激情国产日韩| 一本久道久久久| 国产欧美日本| 欧美裸体一区二区三区| 久久精品日韩欧美| 一区二区三区欧美成人| 欧美成人精品在线观看| 亚洲欧美日韩一区二区三区在线| 亚洲二区视频| 国际精品欧美精品| 欧美三级小说| 欧美成人激情视频| 久久精品毛片| 亚洲综合精品| 9国产精品视频| 欧美激情精品久久久久久蜜臀| 久久不射2019中文字幕| 亚洲欧美视频一区二区三区| 精品不卡在线| 国产精品美女www爽爽爽| 欧美国产日本韩| 久久久久久久999精品视频| 亚洲欧美在线网| 亚洲蜜桃精久久久久久久|