前文已介绍了元类型的子线程与主线程的通信,下面介绍自定义数据类型的处理方式。
https://blog.youkuaiyun.com/qq_38082979/article/details/123686950?spm=1001.2014.3001.5501
二:子线程与主线程通信(自定义数据类型)
方法一:在连接槽函数前,使用qRegisterMetaType将消息注册为元类型。
1.定义消息
#pragma once
#include <QMetaType>
#include <qstring.h>
struct Msg
{
int nCnt;
QString strInfo;
};
Q_DECLARE_METATYPE(Msg) //向QT声明该结构体
2.新建子线程:发信号
#pragma once
#include <QObject>
#include <QThread>
#include "msg.h"
class MyThread2 : public QThread
{
Q_OBJECT
public:
MyThread2(QObject *parent = 0);
~MyThread2();
protected:
void run();
signals:
void DisplaySignal(Msg);
private:
Msg msg;
};
#include "MyThread2.h"
MyThread2::MyThread2(QObject *parent)
: QThread(parent)
{
}
MyThread2::~MyThread2()
{
}
void MyThread2::run()
{
msg.nCnt = 2;
msg.strInfo = "How much?";
emit DisplaySignal(msg);
}
3.主线程:接收信号,执行槽函数
#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_QtRelated.h"
#include "msg.h"
#include "MyThread2.h"
class QtRelated : public QMainWindow
{
Q_OBJECT
public:
QtRelated(QWidget *parent = Q_NULLPTR);
private slots:
void DisplayMsg(Msg);
private slots:
void on_pbStart_clicked();
private:
Ui::QtRelatedClass ui;
MyThread2* thread2;
};
#include "QtRelated.h"
QtRelated::QtRelated(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
thread2 = new MyThread2();
qRegisterMetaType<Msg>("Msg"); //注册为元类型
connect(thread2, SIGNAL(DisplaySignal(Msg)), this, SLOT(DisplayMsg(Msg)));
}
void QtRelated::DisplayMsg(Msg msg)
{
ui.txtDisplay->append(QString::number(msg.nCnt));
ui.txtDisplay->append(msg.strInfo);
}
void QtRelated::on_pbStart_clicked()
{
if (thread2 != nullptr)
{
thread2->start();
}
}
4.运行效果
方法二:如果不使用qRegisterMetaType注册元类型,则可使用QVariant。
1.定义消息
#pragma once
#include <QMetaType>
struct Data
{
qreal timestamp;
qreal open;
qreal high;
qreal low;
qreal close;
};
Q_DECLARE_METATYPE(Data) //向QT声明该结构体
2.新建子线程:发信号
#pragma once
#include <QObject>
#include <QThread>
#include <QVariant>
#include "msg.h"
class MyThread3 : public QThread
{
Q_OBJECT
public:
MyThread3(QObject *parent = 0);
~MyThread3();
protected:
void run();
signals:
void DisplaySignal(QVariant);
private:
Data data;
};
#include "MyThread3.h"
MyThread3::MyThread3(QObject *parent)
: QThread(parent)
{
}
MyThread3::~MyThread3()
{
}
void MyThread3::run()
{
data.timestamp = 1.0;
data.open = 2.0;
data.high = 3.0;
data.low = 4.0;
data.close = 5.0;
QVariant variant;
variant.setValue(data);
emit DisplaySignal(variant);
}
3.主线程:接收信号,执行槽函数
#pragma once
#include <QtWidgets/QMainWindow>
#include <QVariant>
#include "ui_QtRelated.h"
#include "msg.h"
#include "MyThread3.h"
class QtRelated : public QMainWindow
{
Q_OBJECT
public:
QtRelated(QWidget *parent = Q_NULLPTR);
private slots:
void DisplayStruct(QVariant);
private slots:
void on_pbStart_clicked();
private:
Ui::QtRelatedClass ui;
MyThread3* thread3;
};
#include "QtRelated.h"
QtRelated::QtRelated(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
thread3 = new MyThread3();
connect(thread3, SIGNAL(DisplaySignal(QVariant)), this, SLOT(DisplayStruct(QVariant)));
}
void QtRelated::DisplayStruct(QVariant variant)
{
Data data = variant.value<Data>();// variant相当于一个容器放结构体的数据
ui.txtDisplay->append(QString::number(data.timestamp));
ui.txtDisplay->append(QString::number(data.open));
ui.txtDisplay->append(QString::number(data.high));
ui.txtDisplay->append(QString::number(data.low));
ui.txtDisplay->append(QString::number(data.close));
}
void QtRelated::on_pbStart_clicked()
{
if (thread3 != nullptr)
{
thread3->start();
}
}
4.运行效果