想要發射信號時,攜帶自定義的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&");