QT信號槽傳遞自定義結構體


QT的信號槽可以傳遞int, short, double等c語言的常用類型的變量,也可以傳遞如QImage之類的QT支持 的類型。但是如何傳遞一個程序員自定義的結構體?

1)在定義結構體之后,要調用Q_DECLARE_METATYPE,向QT聲明這個結構體

2)在main.cpp 中,用connect函數 將拋出此結構體的信號和接收此結構體的槽函數關聯之前,要調用qRegisterMetaType()注冊此結構體

看下面例子 ,在專門定義結構體的頭文件里調用Q_DECLARE_METATYPE

  1. #ifndef PROTOCOL_H
  2. #define PROTOCOL_H
  3.  
  4. #include <QMetaType>
  5.  
  6. #pragma pack(push, 1)
  7.  
  8. #if !defined(DEF_ST_ARB_STRUCT)
  9. typedef struct ST_ARB_STRUCT
  10. {
  11. double d;
  12. int i;
  13. char c;
  14. } ST_ARB_STRUCT;
  15. #define DEF_ST_ARB_STRUCT
  16.  
  17. Q_DECLARE_METATYPE(ST_ARB_STRUCT);
  18. //qRegisterMetaType<ST_ARB_STRUCT>();
  19. #endif
  20.  
  21. #pragma pack(pop)
  22. #endif // PROTOCOL_H
  23.  

定義類ArbStruct,負責向另一個類發射含有(ST_ARB_STRUCT)的信號sigArbStruct(ST_ARB_STRUCT)

  1. #ifndef ARBSTRUCT_H
  2. #define ARBSTRUCT_H
  3.  
  4. #include "protocol.h"
  5. #include <QObject>
  6.  
  7. class ArbStruct : public QObject
  8. {
  9. Q_OBJECT
  10. public:
  11. ArbStruct();
  12.  
  13. signals:
  14. void sigArbStruct(ST_ARB_STRUCT);
  15.  
  16. public slots:
  17. void OnRecvEmit(void);
  18. };
  19.  
  20. #endif // ARBSTRUCT_H

特別地,這個類ArbStruct被封裝為一個lib庫,為的是證明即使發射信號的類的定義跟接收方的定義並不處於同一個項目里,信號槽仍然可以走通。

  1. #include "arbstruct.h"
  2.  
  3.  
  4. ArbStruct::ArbStruct()
  5. {
  6. }
  7.  
  8. void ArbStruct::OnRecvEmit(void)
  9. {
  10. ST_ARB_STRUCT stMsg;
  11. stMsg.d = 6.5;
  12. stMsg.c = 0;
  13. stMsg.i = -1;
  14.  
  15. emit sigArbStruct(stMsg);
  16. }

在主工程里定義另一個類,負責接收sigArbStruct(ST_ARB_STRUCT)

  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3.  
  4. #include <QMainWindow>
  5. #include "protocol.h"
  6.  
  7. namespace Ui {
  8. class MainWindow;
  9. }
  10.  
  11. class MainWindow : public QMainWindow
  12. {
  13. Q_OBJECT
  14.  
  15. public:
  16. explicit MainWindow(QWidget *parent = 0);
  17. ~MainWindow();
  18. signals:
  19. void sigClicked(void);
  20. public slots:
  21. void OnRecvArbStruct(ST_ARB_STRUCT);
  22. private:
  23. Ui::MainWindow *ui;
  24. };
  25.  
  26. #endif // MAINWINDOW_H

接收到ArbStruct發來的信號后,MainWindow將把信號內的數據顯示在界面上

  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3.  
  4. MainWindow::MainWindow(QWidget *parent) :
  5. QMainWindow(parent),
  6. ui( new Ui::MainWindow)
  7. {
  8. ui->setupUi( this);
  9. connect(ui->pushButton, SIGNAL(clicked()), this, SIGNAL(sigClicked()));
  10. }
  11.  
  12. MainWindow::~MainWindow()
  13. {
  14. delete ui;
  15. }
  16.  
  17. void MainWindow::OnRecvArbStruct(ST_ARB_STRUCT stMsg)
  18. {
  19. ui->label->setText(QString( "d = %1, i = %2, c = %3")
  20. .arg(stMsg.d).arg(stMsg.i).arg( int(stMsg.c)));
  21. }

最后在main.cpp里聯系兩個類,注意用了qRegisterMetaType:

  1. #include "mainwindow.h"
  2. #include <QApplication>
  3. #include "protocol.h"
  4. #include "arbstruct.h"
  5.  
  6. #pragma comment(lib, "ArbStruct.lib")
  7.  
  8. int main(int argc, char *argv[])
  9. {
  10. QApplication a(argc, argv);
  11.  
  12. ArbStruct arb;
  13. MainWindow w;
  14.  
  15. qRegisterMetaType<ST_ARB_STRUCT>( "ST_ARB_STRUCT");
  16. QObject::connect(&arb, SIGNAL(sigArbStruct(ST_ARB_STRUCT)), &w, SLOT(OnRecvArbStruct(ST_ARB_STRUCT)));
  17. QObject::connect(&w, SIGNAL(sigClicked()), &arb, SLOT(OnRecvEmit()));
  18. w.show();
  19.  
  20. return a.exec();
  21. }

本示例可以在我的資源中下載


免責聲明!

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



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