Qt 信號槽收發自定義類/自定義結構體的2種方法


想要發射信號時,攜帶自定義的class或者struct,必須要做一下處理,否則編譯時不會報錯,但運行時會出錯。

假設我們自定義了一個結構體:

1 typedef struct
2 { 3     ...// 4     ...// 5 }Frame7E;

如果想要這么用:

1 Frame7E frame; 2 ...//填充frame
3 emit sendFrame(frame);

那么必須使用以下兩種方法之一。

方法1:使用宏:Q_DECLARE_METATYPE

該方法的原理是使得QVariant類支持我們自定義的類型,而QT的信號槽是支持發射QVariant類型數據的,然后我們可以用QVariant封裝這個自定義類/結構,然后emit 出去QVariant類型的變量。

 1   #include <qmetatype.h>
 2   //發射端
 3  Frame7E frame;  4   ...//填充frame
 5   QVariant var;  6   var.setValue(frame); // copy s into the variant
 7   emit sendFrame(var);//發QVariant類型的信號
 8  
 9  
10  接收端 11   // retrieve the value
12   Frame7E s2 = var.value<Frame7E>();//QVariant 轉換為 Frame7E 

方法2:使用qRegisterMetaType函數使得QT的信號槽支持自定義類型

1 #include <QMetaType>
2  
3 //注冊自定義類型,使QT的信號槽支持我們的類型
4 qRegisterMetaType<Frame7E>("Frame7E");//參數無所謂,建議帶上同名字符串參數

注冊完之后,就可以正常使用信號槽了。

需要注意以下幾點:

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


免責聲明!

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



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