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

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

Qt元類型(MetaType)注冊(cè)門

      昨天調(diào)試項(xiàng)目時(shí),突然發(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的信號(hào)-槽函數(shù)的參數(shù)中使用了這個(gè)枚舉型,在發(fā)送信號(hào)時(shí)就出現(xiàn)了上述警告。上面警告的大概意思是信號(hào)隊(duì)列中無(wú)法使用 ERROR_LEVEL類型,要使用qRegisterMetaType()注冊(cè)該類型后方可使用。

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

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

  • Qt::QueuedConnection(排隊(duì)方式)

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

  • Qt::AutoConnection(自動(dòng)方式)

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

      我的項(xiàng)目中的確跨線程使用了ERROR_LEVEL為參數(shù)類型的信號(hào),因此使用的應(yīng)當(dāng)是排隊(duì)方式的信號(hào)-槽機(jī)制,出現(xiàn)“隊(duì)列中無(wú)法使用ERROR_LEVEL類型”的警告信息就可以理解了。放狗搜了一圈,有篇文章提供了個(gè)這樣的解決方案:

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);

這樣做的確能使警告信息消失,因?yàn)镼t官方文檔寫了:

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.

即使用排隊(duì)方式的信號(hào)-槽機(jī)制,Qt的元對(duì)象系統(tǒng)(meta-object system)必須知道信號(hào)傳遞的參數(shù)類型。這里手動(dòng)改為直連方式,Qt的元對(duì)象系統(tǒng)就不必知道參數(shù)類型了,于是警告信息消失。但這樣做是不安全的,見(jiàn)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.

      因此,咱還是老老實(shí)實(shí)地用qRegisterMetaType()注冊(cè)類型吧,見(jiàn)代碼:

頭文件

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

/*! \enum ERROR_LEVEL
 * 錯(cuò)誤等級(jí)的定義。通常用來(lái)在傳遞錯(cuò)誤消息時(shí)標(biāo)記錯(cuò)誤的等級(jí)。
 */
enum ERROR_LEVEL
{
    NORMAL,  /*!< 普通錯(cuò)誤,通常不需要處理,可以記錄或者顯示錯(cuò)誤消息。*/
    CRITICAL /*!< 嚴(yán)重錯(cuò)誤,需要緊急處理,如果沒(méi)有妥善處理,可能導(dǎo)致后續(xù)操作失敗。*/
};

#endif // ERRORLEVEL_H

cpp文件

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

/*! 模板函數(shù)顯式實(shí)例化,注冊(cè)ERROR_LEVEL到元對(duì)象系統(tǒng)。這樣才可以在信號(hào)-槽
 * 隊(duì)列里使用ERROR_LEVEL類型參數(shù)。
 */
int i = qRegisterMetaType<ERROR_LEVEL>("ERROR_LEVEL");
元類型注冊(cè)方法受益于這篇文章。
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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一区二区三区久久| 久久激情网站| 久久久久久色| 欧美成人免费小视频| 欧美成人精品高清在线播放| 亚洲大胆人体在线| 久久精品在线免费观看| 久久免费视频在线| 欧美激情一区二区三区在线| 亚洲国产一区二区三区a毛片 | 久久综合给合久久狠狠狠97色69| 久久久青草婷婷精品综合日韩| 免费不卡在线视频| 欧美日韩国产成人在线观看| 亚洲国产婷婷香蕉久久久久久| 国产亚洲欧美日韩一区二区| 国产欧美日韩另类一区| 日韩视频永久免费| 亚洲欧美日韩国产中文| 国产伦理一区| 久久嫩草精品久久久精品一| 久久免费视频一区| 91久久久亚洲精品| 亚洲人被黑人高潮完整版| 欧美国产日本高清在线| 亚洲少妇诱惑| 亚洲欧美另类综合偷拍| 激情综合网址| 最新日韩欧美| 国产精品一区二区女厕厕| 欧美自拍偷拍| 美女91精品| 国产一区二区三区不卡在线观看| 国产欧美精品在线播放| 在线亚洲伦理| 亚洲福利av| 久久婷婷丁香| 国产精品一区二区你懂得| 狠狠色综合网站久久久久久久| 亚洲无人区一区| 91久久精品一区二区别| 久久久久看片| 国产亚洲精品久久久久动| av成人免费| 亚洲二区视频| 免费观看成人| 一区二区视频欧美| 久久久另类综合| 亚洲一级电影| 国产精品国产馆在线真实露脸| 99人久久精品视频最新地址| 欧美激情精品久久久久久大尺度 | 最新国产成人在线观看| 欧美中文字幕在线播放| 一本到高清视频免费精品| 欧美激情一区二区三区蜜桃视频| 激情成人中文字幕| 久久午夜视频| 久久精品视频网| 激情伊人五月天久久综合| 久久亚洲精品一区| 久久成年人视频| 伊人久久久大香线蕉综合直播| 久久久久久久久久码影片| 性欧美大战久久久久久久久| 国产精品色午夜在线观看| 欧美亚洲色图校园春色| 亚洲视频大全| 国产欧美一区二区精品忘忧草 | 国产精品一区二区欧美| 亚洲一区制服诱惑| 一本色道久久综合狠狠躁篇怎么玩 | 欧美激情成人在线视频| 亚洲国产欧美一区二区三区久久 | **欧美日韩vr在线| 欧美国产日韩a欧美在线观看| 麻豆精品视频在线| 99精品黄色片免费大全| 日韩一级网站| 国产精品卡一卡二| 久久精品国产免费观看| 久久久精品国产99久久精品芒果| 亚洲缚视频在线观看| 欧美激情a∨在线视频播放| 欧美人妖在线观看| 欧美一区1区三区3区公司| 久久精品91久久久久久再现| 亚洲国产日韩美| 一本色道久久综合亚洲精品不 | 国产精品成人观看视频免费| 亚洲欧美视频一区| 欧美一区午夜视频在线观看| 亚洲国产女人aaa毛片在线| 亚洲精品一区二区三区不| 国产精品腿扒开做爽爽爽挤奶网站| 久久午夜电影| 欧美日韩日本国产亚洲在线| 久久久精品国产免费观看同学| 欧美成人午夜激情在线| 午夜精品免费| 欧美aaaaaaaa牛牛影院| 午夜性色一区二区三区免费视频| 久久久免费av| 午夜在线观看欧美| 欧美国产乱视频| 久久久久久国产精品一区| 欧美国产精品va在线观看| 久久久久久久成人| 国产精品视频免费观看| 亚洲高清在线观看| 黄色亚洲在线| 香蕉久久精品日日躁夜夜躁| 亚洲午夜激情网页| 欧美精品18+| 免费不卡欧美自拍视频| 国产日韩欧美在线播放| 一本一本久久| 9色国产精品| 牛人盗摄一区二区三区视频| 欧美在线播放| 欧美激情综合在线| 欧美一区中文字幕| 裸体歌舞表演一区二区| 亚洲国产精品一区制服丝袜 | 国产区亚洲区欧美区| 9i看片成人免费高清| 亚洲欧洲精品一区二区三区不卡 | 激情欧美一区二区三区在线观看| 亚洲视频观看| 国产精品一区免费观看| 性欧美大战久久久久久久免费观看| 欧美成人午夜剧场免费观看| aa级大片欧美三级| 国产欧美日韩综合| 欧美精品久久一区| 久久狠狠婷婷| 一区二区三区视频在线播放| 欧美77777| 欧美亚洲一区二区三区| 亚洲精品一区二区三区在线观看| 国产伦一区二区三区色一情| 欧美成年人视频网站欧美| 午夜精品视频| 日韩视频免费| 欧美激情亚洲国产| 久久精品国产精品亚洲| 99精品免费| 在线精品亚洲| 国产午夜精品全部视频播放| 欧美三级乱码| 欧美激情一区二区三区蜜桃视频 | 亚洲美女性视频| 欧美www在线| 欧美在线短视频| 国产精品99久久久久久人| 亚洲国产精品热久久| 国产日韩亚洲欧美精品| 欧美视频二区| 欧美日韩国产综合视频在线观看中文| 久久性天堂网| 久久精品99无色码中文字幕| 亚洲欧美日本视频在线观看| 日韩网站免费观看| 亚洲人成亚洲人成在线观看| 玖玖玖国产精品| 久久久久久久激情视频| 久久黄金**| 欧美中文字幕第一页| 亚洲一级二级| 99精品欧美一区二区三区| 亚洲欧洲一区二区在线播放| 一区二区三区亚洲| 狠狠色噜噜狠狠色综合久| 国产午夜精品久久久| 国产一区日韩欧美| 狠狠色狠狠色综合日日tαg| 国产一在线精品一区在线观看| 亚洲日本理论电影| 香蕉免费一区二区三区在线观看| 在线欧美日韩国产| 欧美精品一二三| 欧美精品尤物在线| 欧美精品1区| 亚洲一区二区av电影| 久久精品成人| 国产精品美女黄网| 亚洲精品孕妇| 亚洲美女免费精品视频在线观看| 亚洲精品在线视频| 亚洲少妇自拍| 日韩视频亚洲视频| 亚洲人成免费| 日韩一本二本av| 狠狠综合久久av一区二区老牛| 欧美日韩国产免费| 中文av一区二区| 亚洲精品在线观看视频|