将结构体数组类型数据从子线程传到主线程
定义结构体数组的.h文件
// 需要传的结构体数组
#ifndef STRUCT_H
#define STRUCT_H
typedef struct msg {
int value;
int seq;
} __attribute__((packed)) msg;
#endif // STRUCT_H
子线程头文件定义
#ifndef LIDAR_H
#define LIDAR_H
#include <QThread>
#include "struct.h"
// 定义一个结构体 将需要传递结构体数组放入这个结构体中
struct pack{
msg info[2]; //定义一个结构体数组
};
class TestThread : public QThread{
Q_OBJECT
public:
TestThread();
protected:
void run() Q_DECL_OVERRIDE;
signals:
void TestSignal(pack); // 自定义信号函数
};
#endif // LIDAR_H
子线程cpp文件
#include "lidar.h"
#include <QTime>
pack p; // 定义一个结构体
TestThread::TestThread(){
}
void TestThread::run(){
p.info[0].seq = 1;
p.info[0].value = 1;
p.info[1].seq = 2;
p.info[1].value = 2;
while (1) {
emit TestSignal(p); // 发射信号
msleep(500);
}
}
主线程.h文件
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include "lidar.h"
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
Q_OBJECT
private:
TestThread threadA;
public:
explicit Dialog(QWidget *parent = 0);
~Dialog();
private slots:
void TestSlot(pack); // 定义的槽函数
private:
Ui::Dialog *ui;
};
#endif // DIALOG_H
主线程cpp文件
#include "dialog.h"
#include "ui_dialog.h"
#include <QDebug>
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
qRegisterMetaType<pack>("pack"); // 将保存结构体数组的结构体注册
connect(&threadA,SIGNAL(TestSignal(pack)),this,SLOT(TestSlot(pack)));
threadA.start();
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::TestSlot(pack p){
for(int i=0;i<2;i++){
qDebug()<<p.info[i].seq;
qDebug()<<p.info[i].value;
}
}