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

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

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

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

Qt元類型(MetaType)注冊門

      昨天調(diào)試項目時,突然發(fā)現(xiàn)如下消息:

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

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

      通常使用的connect,實際上最后一個參數(shù)使用的是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(直連方式)

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

  • Qt::QueuedConnection(排隊方式)

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

  • Qt::AutoConnection(自動方式)

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

      我的項目中的確跨線程使用了ERROR_LEVEL為參數(shù)類型的信號,因此使用的應當是排隊方式的信號-槽機制,出現(xiàn)“隊列中無法使用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的元對象系統(tǒng)(meta-object system)必須知道信號傳遞的參數(shù)類型。這里手動改為直連方式,Qt的元對象系統(tǒng)就不必知道參數(shù)類型了,于是警告信息消失。但這樣做是不安全的,見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 /*!< 嚴重錯誤,需要緊急處理,如果沒有妥善處理,可能導致后續(xù)操作失敗。*/
};

#endif // ERRORLEVEL_H

cpp文件

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

/*! 模板函數(shù)顯式實例化,注冊ERROR_LEVEL到元對象系統(tǒng)。這樣才可以在信號-槽
 * 隊列里使用ERROR_LEVEL類型參數(shù)。
 */
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>
            亚洲欧美在线免费| 久久精品视频99| 国产精品私人影院| 欧美日韩综合另类| 欧美日韩精品一区二区天天拍小说| 久久噜噜噜精品国产亚洲综合 | 国产视频一区三区| 国产精品素人视频| 国产精品网站在线| 国产精品影视天天线| 国产麻豆精品久久一二三| 久久免费视频在线| 欧美高清影院| 夜夜嗨av色一区二区不卡| 亚洲欧美日韩国产另类专区| 久久精品99久久香蕉国产色戒 | 欧美在线日韩精品| 久久蜜桃香蕉精品一区二区三区| 免费在线观看日韩欧美| 亚洲日本va午夜在线影院| aaa亚洲精品一二三区| 亚洲在线观看视频| 欧美视频中文字幕| 国产精品播放| 狠狠网亚洲精品| 亚洲美女视频网| 欧美在线观看一区二区三区| 欧美风情在线观看| 欧美一区二区视频网站| 欧美精品一区二| 韩国成人精品a∨在线观看| 亚洲少妇在线| 亚洲高清av在线| 欧美一级淫片播放口| 欧美精品在线一区二区| 精东粉嫩av免费一区二区三区| 一片黄亚洲嫩模| 欧美第一黄色网| 欧美一区激情| 国产欧美亚洲一区| 亚洲欧美日韩国产中文在线| 亚洲国产三级| 久久综合中文色婷婷| 国产精品久久网站| 亚洲人成亚洲人成在线观看| 久久久久国产精品麻豆ai换脸| 亚洲国产精品v| 欧美在线地址| 国产美女精品视频免费观看| 亚洲视频中文字幕| 亚洲人成网站在线观看播放| 久久久久久69| 国产综合色产在线精品| 香蕉久久夜色精品| 亚洲一区二区三区久久| 国产精品国产三级欧美二区| 日韩亚洲欧美一区| 亚洲黄色免费网站| 欧美 日韩 国产 一区| 一色屋精品亚洲香蕉网站| 久久经典综合| 裸体一区二区| 日韩视频免费大全中文字幕| 91久久精品一区| 欧美精品在线观看91| 亚洲欧洲综合| 亚洲国产精品电影| 欧美aa在线视频| 91久久夜色精品国产九色| 亚洲国产第一| 国产精品v欧美精品v日本精品动漫 | 亚洲高清视频中文字幕| 蜜桃av噜噜一区二区三区| 亚洲国内高清视频| 亚洲欧洲日韩综合二区| 国产精品vvv| 久久久久91| 欧美日韩福利| 久久狠狠久久综合桃花| 亚洲欧美怡红院| 一区二区亚洲| 欧美国产综合| 欧美日本不卡| 午夜激情一区| 老司机午夜精品视频| 夜夜嗨av一区二区三区中文字幕| av成人福利| 国产日韩欧美不卡在线| 欧美成人第一页| 欧美日韩精品高清| 久久经典综合| 欧美日韩国产精品一卡| 欧美专区在线| 欧美激情小视频| 欧美一区二区性| 毛片基地黄久久久久久天堂| 亚洲午夜在线观看| 久久婷婷色综合| 亚洲一区二区三区免费在线观看| 久久精品免费看| 亚洲一区二区三区在线| 免费久久精品视频| 久久精品国产成人| 欧美日韩亚洲一区二区| 欧美成人免费小视频| 国产精品网站视频| 亚洲人成网站色ww在线| 国产最新精品精品你懂的| 日韩亚洲一区二区| 亚洲第一综合天堂另类专| 亚洲午夜久久久| 一本色道久久99精品综合| 久久久久久夜精品精品免费| 亚洲欧美日韩区| 欧美经典一区二区| 免费视频亚洲| 含羞草久久爱69一区| 亚洲欧美一区二区三区极速播放| 一区二区三区视频在线| 美女日韩欧美| 美女任你摸久久| 国内久久视频| 性做久久久久久| 欧美一区二区视频观看视频| 欧美视频在线免费| 一本色道久久88综合日韩精品| 亚洲狼人精品一区二区三区| 久久精品91久久久久久再现| 久久国产高清| 国产伦理一区| 欧美一区二区三区在线视频| 新片速递亚洲合集欧美合集| 国产精品久久久久一区二区三区| 亚洲精选一区二区| 一本色道久久加勒比精品| 欧美激情视频在线免费观看 欧美视频免费一| 久久精品国产在热久久| 国产欧美亚洲日本| 久久国产精品久久久| 久久精品女人天堂| 伊人激情综合| 免费av成人在线| 亚洲黄网站在线观看| 亚洲免费播放| 亚洲天天影视| 国产精品美女| 亚洲一区免费看| 欧美在线观看你懂的| 国产女人18毛片水18精品| 午夜日韩视频| 久久香蕉国产线看观看av| 很黄很黄激情成人| 久色婷婷小香蕉久久| 亚洲国产另类精品专区| 一本色道久久88综合亚洲精品ⅰ | 免费毛片一区二区三区久久久| 欧美福利一区二区| 亚洲视频精选| 国产一级久久| 免费在线观看精品| 一区二区精品在线| 性欧美在线看片a免费观看| 国产欧美视频一区二区| 麻豆av一区二区三区久久| 亚洲剧情一区二区| 久久国产精品99国产精| 亚洲高清色综合| 国产精品初高中精品久久| 欧美亚洲免费电影| 91久久精品国产91性色| 欧美中文字幕第一页| 亚洲国产免费看| 国产精品视频男人的天堂| 噜噜噜噜噜久久久久久91| 99精品99| 欧美激情乱人伦| 欧美一区二区视频在线| 99在线视频精品| 国模私拍一区二区三区| 欧美日韩日日夜夜| 久久视频在线看| 在线一区日本视频| 欧美韩日一区二区三区| 欧美一区二区三区免费视| 亚洲精品视频一区二区三区| 国产精品视频九色porn| 欧美精品在线观看播放| 久久综合中文| 久久精品免费| 午夜一级久久| 中文久久乱码一区二区| 91久久精品国产91久久| 老巨人导航500精品| 香蕉成人啪国产精品视频综合网| 99精品国产在热久久婷婷| 在线日韩av| 狠狠色噜噜狠狠狠狠色吗综合| 国产精品免费福利| 欧美日韩一二三区| 欧美激情中文不卡|