成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺析 Qt 元類(lèi)型(MetaType)注冊(cè)

移動(dòng)開(kāi)發(fā)
自定義類(lèi)型需要符合所有QMetaType提供的強(qiáng)制要求. 換句話(huà)說(shuō), 它必須提供:一個(gè)公共的默認(rèn)構(gòu)造函數(shù),一個(gè)公共的拷貝構(gòu)造函數(shù), 和一個(gè)公共的析構(gòu)函數(shù)。請(qǐng)看內(nèi)容。

 

本文介紹的是 Qt 元類(lèi)型(MetaType)注冊(cè),請(qǐng)先來(lái)看內(nèi)容。

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

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

通常使用的connect,實(shí)際上***一個(gè)參數(shù)使用的是Qt::AutoConnection類(lèi)型:

  1. bool QObject::connect ( const QObject   
  2. * sender, const char   
  3. * signal, const QObject   
  4. * receiver, const char   
  5. * 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)系類(lèi)似于函數(shù)調(diào)用,同步執(zhí)行)

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

當(dāng)信號(hào)發(fā)出后,排隊(duì)到信號(hào)隊(duì)列中,需等到接收對(duì)象所屬線(xiàn)程的事件循環(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)系類(lèi)似于消息通信,異步執(zhí)行)

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

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

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

  1. connect(cm, SIGNAL(sendLog(QUuid, QByteArray, bool)),   
  2.             this,SLOT(sendRes(QUuid,QByteArray,bool)));  

改為:

  1. connect(cm, SIGNAL(sendLog(QUuid, QByteArray, bool)),   
  2.             this,SLOT(sendRes(QUuid,QByteArray,bool)), Qt::DirectConnection); 

這樣做的確能使警告信息消失,因?yàn)?strong>Qt官方文檔寫(xiě)了:

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ù)類(lèi)型。這里手動(dòng)改為直連方式,Qt的元對(duì)象系統(tǒng)就不必知道參數(shù)類(lèi)型了,于是警告信息消失。但這樣做是不安全的,見(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è)類(lèi)型吧,見(jiàn)代碼:

頭文件:

  1. /*! \file errorlevel.h*/  
  2. #ifndef ERRORLEVEL_H  
  3. #define ERRORLEVEL_H  
  4. /*! \enum ERROR_LEVEL  
  5. * 錯(cuò)誤等級(jí)的定義。通常用來(lái)在傳遞錯(cuò)誤消息時(shí)標(biāo)記錯(cuò)誤的等級(jí)。  
  6.  */  
  7. enum ERROR_LEVEL  
  8. {  
  9.     NORMAL,  /*!< 普通錯(cuò)誤,通常不需要處理,可以記錄或者顯示錯(cuò)誤消息。*/  
  10.     CRITICAL /*!< 嚴(yán)重錯(cuò)誤,需要緊急處理,如果沒(méi)有妥善處理,可能導(dǎo)致后續(xù)操作失敗。*/  
  11. };  
  12. #endif // ERRORLEVEL_Hcpp文件:  
  13. /*! \file errorlevel.cpp*/  
  14. #include "errorlevel.h"  
  15. /*! 模板函數(shù)顯式實(shí)例化,注冊(cè)ERROR_LEVEL到元對(duì)象系統(tǒng)。這樣才可以在信號(hào)-槽  
  16.  * 隊(duì)列里使用ERROR_LEVEL類(lèi)型參數(shù)。  
  17.  */  
  18. int i = qRegisterMetaType<ERROR_LEVEL>("ERROR_LEVEL"); 

元類(lèi)型注冊(cè)方法受益于 http://www.cnblogs.com/codingmylife/archive/2010/04/30/1725139.html

小結(jié):Qt 元類(lèi)型(MetaType)注冊(cè)的內(nèi)容介紹完了,希望本文對(duì)你有所幫助!

責(zé)任編輯:zhaolei 來(lái)源: 互聯(lián)網(wǎng)
相關(guān)推薦

2011-06-30 17:51:17

QT 元類(lèi)型 線(xiàn)程

2011-06-10 13:21:00

Qt 網(wǎng)絡(luò)

2011-06-20 15:13:08

Qt 對(duì)象模型

2011-06-21 13:52:18

Qt 界面

2011-06-10 11:24:08

Qt Quick Designer

2011-06-13 11:07:22

QT 移植

2011-06-09 18:05:00

QT MySql

2011-06-15 18:00:26

2011-06-09 18:24:36

QT Wince

2011-06-10 15:00:02

Qt VC

2009-09-07 16:44:28

Linq String

2009-08-31 09:20:37

C#事件注冊(cè)和注銷(xiāo)

2011-06-10 14:33:38

Qt VC.NET

2011-06-29 15:14:22

Qt Embedded 鍵盤(pán)

2011-06-29 15:36:21

Qt Embedded 鍵盤(pán)

2011-06-10 09:09:38

Qt Creator OpenCV

2011-12-26 15:58:01

枚舉

2009-08-18 12:52:33

C#枚舉類(lèi)型

2009-08-06 10:14:15

C#引用類(lèi)型數(shù)組

2009-08-18 10:35:46

C#枚舉類(lèi)型
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日韩在线精品 | 成人亚洲视频 | 欧美日韩亚洲国产综合 | 午夜视频在线视频 | www.日韩在线 | 国产黄色大片在线免费观看 | 日日夜夜精品免费视频 | 538在线精品 | 亚洲激情在线视频 | 久久久久成人精品亚洲国产 | 新91视频网 | 国产情侣一区 | 97日日碰人人模人人澡分享吧 | 99影视| 狠狠色狠狠色综合日日92 | 97人人干| 91精品国产一区二区三区蜜臀 | 欧美五月婷婷 | 亚洲精品第一国产综合野 | 欧美精品片 | 国产一区二区久久 | 国产精品视频一区二区三区不卡 | 日韩不卡在线 | 久久久一区二区三区 | 国产亚洲精品区 | 国产乱码精品一区二区三区中文 | 二区三区在线观看 | 国产精品久久久久久久久久久久 | 日本欧美在线 | 国产清纯白嫩初高生在线播放视频 | 国产成人精品一区二区在线 | 午夜精品网站 | 毛片一级片 | 久久1区 | 欧美日韩久久精品 | 国产精品久久久久久久岛一牛影视 | 国产色爽 | 日韩精品一区二区三区视频播放 | 久久久久久天堂 | 伊人精品一区二区三区 | 日本免费一区二区三区视频 |