QT 的信號和槽機制能十分方便的用來傳輸數據,但是如果數據種類比較多,分類比較多的時候,就需要更好地更高效的來傳遞數據的方法。以結構體作為參數是個很不錯的選擇。這幾天寫的程序正好需要以結構體來作為參數,但是網上搜的資料很少,講的也不詳細,我解決了問題后整理了一下,希望給有同樣需求的同學一點幫助
1.首先是結構體的使用,需要使用Q_DECLARE_METATYPE宏
如:
- struct DataStruct
- {
- QByteArray DstAddr;
- QByteArray ClusterId;
- int DstEndpoint;
- int DeviceEndpoint;
- int CommandID;
- QByteArray AttributeID;
- int DataType;
- };
- Q_DECLARE_METATYPE(DataStruct) //這個宏具體的用法參考幫助文檔
2.然后是把該結構體封裝如一個QVariant
- DataStruct askData;
- QVariant DataVar;
- DataVar.setValue(askData);
3.然后是對QVariant進行注冊,因為信號和槽的參數類型並不認識QVariant
- qRegisterMetaType<QVariant>("QVariant"); //寫在構造函數里
4.然后這個類中的信號就可以將QVariant作為參數了
- signals:
- void send_askData(QVariant dataVar);
5.接收類中,由於包含了發射類的頭文件,所以不必再對結構體進行定義
- connect(readThread,SIGNAL(send_askData(QVariant)),this,SLOT(AF_DATA_REQUEST(QVariant)));
- 在槽函數中
- DataStruct askData;
- askData = dataVar.value<DataStruct>();
這樣就可以提取出容器內的結構體數據,並進行操作了,這對需要傳輸比較復雜的數據時效果比較好