Qt线程间通信——信号槽(二)

前文已介绍了元类型的子线程与主线程的通信,下面介绍自定义数据类型的处理方式。

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.运行效果

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值