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

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

Qt元類型(MetaType)注冊門(收集轉載)

Posted on 2011-04-15 22:56 RTY 閱讀(356) 評論(0)  編輯 收藏 引用 所屬分類: Qt

Qt元類型(MetaType)注冊門

      昨天調試項目時,突然發現如下消息:

QObject::connect: Cannot queue arguments of type 'ERROR_LEVEL'
(Make sure 'ERROR_LEVEL' is registered using qRegisterMetaType().)

其中ERROR_LEVEL只是我定義的枚舉類型即enum ERROR_LEVEL。然后在Qt的信號-槽函數的參數中使用了這個枚舉型,在發送信號時就出現了上述警告。上面警告的大概意思是信號隊列中無法使用 ERROR_LEVEL類型,要使用qRegisterMetaType()注冊該類型后方可使用。

      通常使用的connect,實際上最后一個參數使用的是Qt::AutoConnection類型:

bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoConnection )

Qt支持6種連接方式,其中3中最主要:

  • Qt::DirectConnection(直連方式)

      當信號發出后,相應的槽函數將立即被調用。emit語句后的代碼將在所有槽函數執行完畢后被執行。(信號與槽函數關系類似于函數調用,同步執行

  • Qt::QueuedConnection(排隊方式)

      當信號發出后,排隊到信號隊列中,需等到接收對象所屬線程的事件循環取得控制權時才取得該信號,調用相應的槽函數。emit語句后的代碼將在發出信號后立即被執行,無需等待槽函數執行完畢。(此時信號被塞到信號隊列里了,信號與槽函數關系類似于消息通信,異步執行

  • Qt::AutoConnection(自動方式)

      Qt的默認連接方式,如果信號的發出和接收這個信號的對象同屬一個線程,那個工作方式與直連方式相同;否則工作方式與排隊方式相同。

      我的項目中的確跨線程使用了ERROR_LEVEL為參數類型的信號,因此使用的應當是排隊方式的信號-槽機制,出現“隊列中無法使用ERROR_LEVEL類型”的警告信息就可以理解了。放狗搜了一圈,有篇文章提供了個這樣的解決方案:

connect(cm, SIGNAL(sendLog(QUuid, QByteArray, bool)),
            this,SLOT(sendRes(QUuid,QByteArray,bool)));
改為:
connect(cm, SIGNAL(sendLog(QUuid, QByteArray, bool)),
            this,SLOT(sendRes(QUuid,QByteArray,bool)), Qt::DirectConnection);

這樣做的確能使警告信息消失,因為Qt官方文檔寫了:

With queued connections, the parameters must be of types that are known to Qt's meta-object system, because Qt needs to copy the arguments to store them in an event behind the scenes.

即使用排隊方式的信號-槽機制,Qt的元對象系統(meta-object system)必須知道信號傳遞的參數類型。這里手動改為直連方式,Qt的元對象系統就不必知道參數類型了,于是警告信息消失。但這樣做是不安全的,見Qt官方文檔:

Be aware that using direct connections when the sender and receiver live in different threads is unsafe if an event loop is running in the receiver's thread, for the same reason that calling any function on an object living in another thread is unsafe.

      因此,咱還是老老實實地用qRegisterMetaType()注冊類型吧,見代碼:

頭文件

/*! \file errorlevel.h*/
#ifndef ERRORLEVEL_H
#define ERRORLEVEL_H

/*! \enum ERROR_LEVEL
 * 錯誤等級的定義。通常用來在傳遞錯誤消息時標記錯誤的等級。
 */
enum ERROR_LEVEL
{
    NORMAL,  /*!< 普通錯誤,通常不需要處理,可以記錄或者顯示錯誤消息。*/
    CRITICAL /*!< 嚴重錯誤,需要緊急處理,如果沒有妥善處理,可能導致后續操作失敗。*/
};

#endif // ERRORLEVEL_H

cpp文件

/*! \file errorlevel.cpp*/
#include "errorlevel.h"

/*! 模板函數顯式實例化,注冊ERROR_LEVEL到元對象系統。這樣才可以在信號-槽
 * 隊列里使用ERROR_LEVEL類型參數。
 */
int i = qRegisterMetaType<ERROR_LEVEL>("ERROR_LEVEL");
元類型注冊方法受益于這篇文章
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            蜜桃av一区| 亚洲黄色在线看| 午夜视频在线观看一区| 国产精品色网| 欧美一区二区视频在线观看| 一区二区三区四区五区精品视频| 欧美日韩一区二区三区在线看| 一区二区三区精品久久久| 一区二区精品在线| 国产日韩一区| 蜜臀av一级做a爰片久久| 欧美 日韩 国产精品免费观看| 亚洲精品免费在线播放| 一本色道久久综合亚洲91| 国产精品一区二区三区成人| 久久久久久久久久久久久女国产乱| 久久福利影视| 99riav国产精品| 午夜免费日韩视频| 亚洲精品免费网站| 亚洲一区二区三区涩| 黄色日韩网站视频| 亚洲久久成人| 极品中文字幕一区| 99精品国产在热久久| 国产一区二区三区免费在线观看| 欧美成人亚洲| 国产精品一区二区久久久| 奶水喷射视频一区| 国产精品乱子乱xxxx| 免费成人美女女| 国产精品美女www爽爽爽| 欧美成人综合在线| 国产久一道中文一区| 91久久国产自产拍夜夜嗨| 国产在线欧美| 99精品国产福利在线观看免费| 国产综合色产| 这里只有精品视频| 亚洲激情第一页| 香蕉乱码成人久久天堂爱免费| 亚洲精品一区二区三区四区高清| 午夜欧美视频| 亚洲一区国产精品| 欧美成人自拍视频| 麻豆久久婷婷| 国产亚洲一级| 亚洲一区二区免费视频| 艳妇臀荡乳欲伦亚洲一区| 久久久久欧美| 久久精品一二三区| 国产精品久久国产三级国电话系列| 欧美国产三级| 在线观看欧美亚洲| 久久国产乱子精品免费女| 欧美一区二区免费观在线| 欧美日韩美女在线| 91久久精品美女| 亚洲国产视频直播| 老司机免费视频久久| 美女视频黄免费的久久| 国产在线高清精品| 欧美一区免费视频| 久久久久国产一区二区三区四区| 国产精品久久77777| 夜夜躁日日躁狠狠久久88av| 一区二区高清在线观看| 欧美极品影院| 亚洲精品日韩久久| 中文国产亚洲喷潮| 欧美午夜视频在线| 亚洲午夜精品国产| 欧美在线视频导航| 国产一区视频在线看| 久久久国产成人精品| 美国十次了思思久久精品导航| 激情国产一区二区| 欧美+亚洲+精品+三区| 亚洲片区在线| 亚洲欧美日韩区| 国产亚洲成av人片在线观看桃| 先锋a资源在线看亚洲| 久久久久久夜| 亚洲国产日韩欧美在线动漫| 欧美精品999| 99精品国产在热久久| 亚洲欧美一区在线| 国产午夜精品久久久久久久| 久久精品日韩欧美| 亚洲黄色影院| 欧美有码视频| 最新亚洲激情| 欧美午夜不卡在线观看免费 | 亚洲国产婷婷香蕉久久久久久| 亚洲看片一区| 国产精品美女www爽爽爽| 欧美亚洲在线视频| 亚洲国产一区二区视频 | 国产日本欧美一区二区三区在线| 久久av一区二区三区| 欧美韩日亚洲| 午夜精品久久久久久99热| 狠狠综合久久av一区二区老牛| 欧美本精品男人aⅴ天堂| 日韩午夜激情| 久久综合九色99| 一区二区三区免费在线观看| 国产一区视频网站| 欧美日韩国产综合视频在线观看中文 | 国产一区二区三区四区| 欧美成人首页| 欧美一级大片在线观看| 亚洲国产激情| 久久精品二区| 亚洲视频一区| 亚洲激情网站| 国内激情久久| 国产精品爱啪在线线免费观看| 久久综合色播五月| 亚洲欧美在线磁力| 99精品国产在热久久下载| 久久综合国产精品| 亚洲一区二区三区免费观看| 亚洲国产精品日韩| 国产真实乱偷精品视频免| 欧美午夜久久久| 欧美精品二区| 美国十次成人| 久久一区亚洲| 久久久精品国产免费观看同学 | 久久综合伊人| 久久成人精品无人区| 亚洲性线免费观看视频成熟| 91久久精品国产91性色| 伊人久久婷婷色综合98网| 国产精品亚洲不卡a| 欧美性事免费在线观看| 欧美日韩精品国产| 欧美精品激情blacked18| 老司机亚洲精品| 久久一区二区三区av| 久久久国产精品一区| 久久成人精品一区二区三区| 午夜欧美电影在线观看| 亚洲欧美国产日韩中文字幕| 亚洲一区二区三| 亚洲自拍偷拍视频| 亚洲资源av| 性色av一区二区三区红粉影视| 午夜久久久久久久久久一区二区| 亚洲私人影院| 午夜精品在线观看| 久久精品在线播放| 久久尤物视频| 欧美激情区在线播放| 欧美日韩性生活视频| 国产精品久久9| 国产丝袜一区二区三区| 激情欧美一区| 亚洲国产高潮在线观看| 亚洲精品乱码久久久久久按摩观| 亚洲精品国产欧美| 亚洲一区二区在线观看视频| 午夜一区在线| 美国三级日本三级久久99| 亚洲成人资源| 亚洲手机视频| 欧美在线免费观看视频| 老色批av在线精品| 欧美日韩国产美女| 国产日韩欧美一区二区| 狠狠干狠狠久久| 91久久国产综合久久| 亚洲一级网站| 久久香蕉国产线看观看网| 欧美电影在线观看完整版| 亚洲精品美女在线| 亚洲欧美日本国产有色| 久久久久久97三级| 欧美日韩喷水| 伊人久久av导航| 亚洲天天影视| 毛片基地黄久久久久久天堂| 亚洲精品影院| 久久久蜜臀国产一区二区| 欧美日韩国产三区| 今天的高清视频免费播放成人 | 国产精品亚洲第一区在线暖暖韩国| 国产亚洲免费的视频看| 日韩网站在线| 麻豆成人综合网| 中文亚洲免费| 欧美精品v日韩精品v国产精品| 国产日本欧美在线观看| 日韩一级黄色大片| 美女国内精品自产拍在线播放| 国产精品99久久久久久久女警| 久久综合网络一区二区| 国产精品一区二区黑丝| 一区二区成人精品 |