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

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>
            亚洲国产成人精品久久| 欧美精品成人一区二区在线观看| 欧美本精品男人aⅴ天堂| 国产欧美日韩一区二区三区在线| 亚洲免费观看高清完整版在线观看熊 | 午夜国产精品影院在线观看| 亚洲精品在线观| 欧美日韩亚洲网| 欧美一区二区视频在线| 亚洲欧美日韩综合国产aⅴ | 欧美在线观看网站| 尤妮丝一区二区裸体视频| 免费不卡在线视频| 欧美极品在线视频| 销魂美女一区二区三区视频在线| 午夜在线视频观看日韩17c| 亚洲电影在线观看| 久久精品日韩欧美| 国产日韩精品一区二区| 欧美在线视频不卡| 久热成人在线视频| 亚洲素人一区二区| 欧美自拍偷拍| 亚洲精品久久久一区二区三区| 一本色道久久综合狠狠躁篇的优点| 国产精品一区二区久久国产| 欧美成年人视频网站欧美| 欧美日韩免费高清| 久久男人av资源网站| 欧美日韩国产一区精品一区| 久久久www成人免费毛片麻豆| 久久先锋资源| 欧美一区综合| 欧美激情精品久久久六区热门| 亚洲欧美资源在线| 欧美高清一区| 免费不卡欧美自拍视频| 国产日韩欧美不卡| 蘑菇福利视频一区播放| 欧美日韩成人一区| 久久亚洲私人国产精品va| 欧美1区2区3区| 欧美一区二区三区视频免费播放 | 99热免费精品| 欧美一区亚洲| 销魂美女一区二区三区视频在线| 欧美va亚洲va香蕉在线| 久久精品国产69国产精品亚洲| 欧美激情一区二区三区四区| 精品不卡视频| 狠狠色2019综合网| 一本色道88久久加勒比精品| 黄色亚洲在线| 亚洲欧美伊人| 亚洲免费视频网站| 欧美日韩美女在线| 亚洲日韩欧美视频一区| 在线精品亚洲一区二区| 先锋影音一区二区三区| 亚洲在线日韩| 欧美日韩国语| 亚洲免费av电影| 日韩亚洲视频| 欧美另类专区| 亚洲精品麻豆| 一区二区三区黄色| 欧美日韩免费一区| 一本色道久久综合亚洲精品不卡 | 一二三区精品福利视频| 极品尤物久久久av免费看| 欧美亚洲一区二区在线| 欧美在线视频播放| 黑人一区二区三区四区五区| 欧美一级大片在线观看| 久久精品99无色码中文字幕| 国产日韩欧美麻豆| 欧美一区=区| 久久女同互慰一区二区三区| 影音先锋在线一区| 免费高清在线视频一区·| 欧美激情2020午夜免费观看| 亚洲国产精品一区二区第一页| 免费亚洲电影| 日韩视频专区| 午夜精品久久久久久久久久久| 国产精品自拍视频| 久久久久久噜噜噜久久久精品| 欧美福利一区二区| 欧美91大片| 亚洲风情亚aⅴ在线发布| 久久综合久久久久88| 亚洲国产精品一区二区第四页av| 99国内精品久久| 欧美午夜宅男影院在线观看| 亚洲欧美成人一区二区在线电影| 久久人人爽人人| 亚洲区免费影片| 国产伦精品一区二区三区高清| 久久不射中文字幕| 亚洲破处大片| 蜜臀av一级做a爰片久久 | 久久久久九九视频| 欧美高清视频www夜色资源网| 中文精品一区二区三区| 国产一区二区在线免费观看 | 欧美高潮视频| 亚洲每日更新| 久久精品日产第一区二区三区| 1024日韩| 国产精品久久久久9999| 久久精彩视频| 一本色道久久综合亚洲精品高清 | 亚洲国产91色在线| 国产精品成人va在线观看| 久久欧美肥婆一二区| 中国av一区| 亚洲级视频在线观看免费1级| 欧美一区二区三区久久精品茉莉花 | 久久久精品一品道一区| 欧美激情精品久久久久久黑人| 亚洲综合色丁香婷婷六月图片| 在线日本成人| 国产手机视频一区二区| 欧美猛交免费看| 鲁大师影院一区二区三区| 亚洲色诱最新| 亚洲免费av电影| 欧美成人午夜视频| 久久久人成影片一区二区三区观看| 亚洲最新在线视频| 日韩一级裸体免费视频| 狠狠色伊人亚洲综合成人| 国产精品系列在线播放| 欧美午夜激情视频| 欧美日韩一区二区三区高清| 免费在线观看一区二区| 久久久久在线| 久久久国产91| 久久久久久亚洲精品杨幂换脸| 欧美一区二区三区视频| 亚洲欧美另类综合偷拍| 亚洲亚洲精品三区日韩精品在线视频 | 欧美久久久久中文字幕| 午夜精品视频在线观看| 亚洲视频一起| 中文在线一区| 亚洲一区二区三区三| 夜夜躁日日躁狠狠久久88av| 亚洲国产一二三| 亚洲国产欧美日韩另类综合| 欧美激情视频一区二区三区在线播放| 美女91精品| 欧美国产日韩精品免费观看| 欧美福利电影在线观看| 亚洲电影免费观看高清完整版在线| 欧美/亚洲一区| 亚洲国产精品传媒在线观看 | 麻豆国产精品va在线观看不卡| 久久婷婷国产麻豆91天堂| 麻豆91精品91久久久的内涵| 欧美jizzhd精品欧美巨大免费| 亚洲国产小视频| 久久久久.com| 久久久久久久久久码影片| 美日韩丰满少妇在线观看| 欧美高清在线视频观看不卡| 91久久精品一区二区三区| 亚洲另类在线一区| 亚洲在线一区| 久久久国产视频91| 欧美经典一区二区三区| 国产精品日韩欧美综合| 狠狠久久五月精品中文字幕| 亚洲人在线视频| 性欧美长视频| 欧美国产精品久久| 99re在线精品| 久久久久高清| 欧美日韩免费视频| 黄色日韩精品| 亚洲视频精选在线| 久久综合中文字幕| 一本色道久久综合亚洲精品按摩 | 久久综合导航| 99一区二区| 久久精品亚洲一区| 久久综合亚州| 国产精品r级在线| 亚洲第一久久影院| 亚洲欧美另类久久久精品2019| 久久综合图片| 亚洲午夜精品| 欧美xart系列高清| 国产欧美日韩免费看aⅴ视频| 亚洲激情av| 久久久噜噜噜久久中文字幕色伊伊 | 麻豆成人在线| 国产欧美日韩视频| 一本大道久久a久久精品综合| 久久尤物电影视频在线观看|