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

淺析 Qt 元類型(MetaType)注冊

移動開發
自定義類型需要符合所有QMetaType提供的強制要求. 換句話說, 它必須提供:一個公共的默認構造函數,一個公共的拷貝構造函數, 和一個公共的析構函數。請看內容。

 

本文介紹的是 Qt 元類型(MetaType)注冊,請先來看內容。

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

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

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

  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(直連方式)

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

Qt::QueuedConnection(排隊方式)

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

Qt::AutoConnection(自動方式)

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

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

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

這樣做的確能使警告信息消失,因為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()注冊類型吧,見代碼:

頭文件:

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

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

小結:Qt 元類型(MetaType)注冊的內容介紹完了,希望本文對你有所幫助!

責任編輯:zhaolei 來源: 互聯網
相關推薦

2011-06-30 17:51:17

QT 元類型 線程

2011-06-10 13:21:00

Qt 網絡

2011-06-20 15:13:08

Qt 對象模型

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#事件注冊和注銷

2011-06-10 14:33:38

Qt VC.NET

2011-06-29 15:14:22

Qt Embedded 鍵盤

2011-06-29 15:36:21

Qt Embedded 鍵盤

2011-06-10 09:09:38

Qt Creator OpenCV

2011-12-26 15:58:01

枚舉

2009-08-18 12:52:33

C#枚舉類型

2009-08-06 10:14:15

C#引用類型數組

2009-08-18 10:35:46

C#枚舉類型
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 99精品欧美一区二区三区综合在线 | 精品欧美二区 | 夜夜操操操 | 丝袜 亚洲 另类 欧美 综合 | av网站免费在线观看 | 成人一区二区视频 | www.天堂av.com | 黄色毛片免费看 | 亚洲精品免费在线观看 | 久久电影一区 | 久久国产精品免费一区二区三区 | 日韩在线不卡视频 | 欧美一区二区三区四区五区无卡码 | 亚洲视频在线观看 | 日韩综合一区 | 中文字幕黄色大片 | 老外几下就让我高潮了 | 日韩精品一区二区三区在线播放 | 久在线精品视频 | www.欧美视频 | 在线免费av电影 | 日韩高清电影 | 久久亚洲一区二区三区四区 | 一起操网站 | 黑人一级片视频 | 国产一级片网站 | 国产精品欧美日韩 | 91亚洲精品国偷拍自产在线观看 | 成人久草| 国产网站在线免费观看 | 国产一区在线视频 | 国产精品国产成人国产三级 | 日韩欧美久久精品 | 亚洲高清视频在线观看 | 国产精品波多野结衣 | 欧美极品在线视频 | 成人精品国产免费网站 | 一级a性色生活片久久毛片 午夜精品在线观看 | 日韩a视频 | 区一区二在线观看 | 亚洲精品电影网在线观看 |