QT信號和槽 傳遞復雜參數


QT 的信號和槽機制能十分方便的用來傳輸數據,但是如果數據種類比較多,分類比較多的時候,就需要更好地更高效的來傳遞數據的方法。以結構體作為參數是個很不錯的選擇。這幾天寫的程序正好需要以結構體來作為參數,但是網上搜的資料很少,講的也不詳細,我解決了問題后整理了一下,希望給有同樣需求的同學一點幫助

1.首先是結構體的使用,需要使用Q_DECLARE_METATYPE宏
如:

  1. struct DataStruct  
  2. {  
  3.     QByteArray DstAddr;  
  4.     QByteArray ClusterId;  
  5.     int DstEndpoint;  
  6.     int DeviceEndpoint;  
  7.     int CommandID;  
  8.     QByteArray AttributeID;  
  9.     int DataType;  
  10. };  
  11. Q_DECLARE_METATYPE(DataStruct)  //這個宏具體的用法參考幫助文檔  

2.然后是把該結構體封裝如一個QVariant

  1. DataStruct askData;  
  2. QVariant DataVar;  
  3. DataVar.setValue(askData);  

3.然后是對QVariant進行注冊,因為信號和槽的參數類型並不認識QVariant

  1. qRegisterMetaType<QVariant>("QVariant"); //寫在構造函數里  

4.然后這個類中的信號就可以將QVariant作為參數了

  1. signals:  
  2.     void send_askData(QVariant dataVar);  

5.接收類中,由於包含了發射類的頭文件,所以不必再對結構體進行定義

  1. connect(readThread,SIGNAL(send_askData(QVariant)),this,SLOT(AF_DATA_REQUEST(QVariant)));  
  2. 在槽函數中  
  3. DataStruct askData;  
  4. askData = dataVar.value<DataStruct>();  

    這樣就可以提取出容器內的結構體數據,並進行操作了,這對需要傳輸比較復雜的數據時效果比較好


免責聲明!

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



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