Qt 線程間信號槽傳遞自定義數據類型(qRegisterMetaType的使用)


不跨線程的話,使用自定義的類型使用signal/slot來傳遞,沒有什么問題。

但如果是跨線程的使用,則沒有這么簡單。

 

直接使用的話,會產生下面這種錯誤:(假定自定義類為MyClass)
QObject::connect: Cannot queue arguments of type 'MyClass' (Make sure 'MyClass' is registed using qRegisterMetaType().)
實際運行中也會發現,該信號槽沒有起作用。

 

其實解決方法在錯誤提示中已經給出了:Make sure 'MyClass' is registed using qRegisterMetaType().
即使用qRegisterMetaType()將自定義類型進行注冊

 

這里總結使用方法如下:
1、注冊位置:在第一次使用此類鏈接跨線程的signal/slot之前,一般在當前類的構造函數中進行注冊;
2、注冊方法:在當前類的頂部包含:#include <QMetaType>,構造函數中加入代碼:qRegisterMetaType<MyClass>("Myclass");
3、Myclass的引用類型需單獨注冊:qRegisterMetaType<MyClass>("Myclass&");

 

如果不實用這種方法,還有一種辦法來使跨線程的signal/slot起作用,即使用connect函數的Qt::DirectConnection參數

connect(A,SIGNAL(sendA(MyClass)),B,SLOT(getA(MyClass)),Qt::DirectConnection);

但此方法官方不推薦使用,認為其不安全。不過在筆者實際使用過程中,未發現有不妥之處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM