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

本文介绍子线程与子线程之间的信号槽处理机制。

1.定义消息

#pragma once
#include <QMetaType>

struct Data
{
	qreal timestamp;
	qreal open;
	qreal high;
	qreal low;
	qreal close;
};
Q_DECLARE_METATYPE(Data)     //向QT声明该结构体

2.子线程1

#pragma once

#include <QObject>
#include <QThread>
#include <QVariant>
#include "msg.h"

class MyThread4 : public QThread
{
	Q_OBJECT

public:
	MyThread4(QObject *parent = 0);
	~MyThread4();

protected:
	void run();

signals:
	void DisplaySignal(QVariant);
private:
	Data data;
};
#include "MyThread4.h"

MyThread4::MyThread4(QObject *parent)
	: QThread(parent)
{
}

MyThread4::~MyThread4()
{
}

void MyThread4::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.子线程2

#pragma once

#include <QObject>
#include <QThread>
#include <QVariant>
#include "msg.h"

class MyThread5 : public QThread
{
	Q_OBJECT

public:
	MyThread5(QObject *parent = 0);
	~MyThread5();

protected:
	void run();

signals:
	void DisplaySignal(QVariant);
	void StartThread();

public slots:
	void DisplayThreadMsg(QVariant);

private:
	Data data;
};
#include "MyThread5.h"

MyThread5::MyThread5(QObject *parent)
	: QThread(parent)
{
}

MyThread5::~MyThread5()
{
}

void MyThread5::run()
{
	QVariant variant;
	variant.setValue(data);
	emit DisplaySignal(variant);
}

void MyThread5::DisplayThreadMsg(QVariant variant)
{
	Data  dataFromThread = variant.value<Data>();// variant相当于一个容器放结构体的数据
	data.timestamp = 1.0 + dataFromThread.timestamp;
	data.open = 2.0 + dataFromThread.open;
	data.high = 3.0 + dataFromThread.high;
	data.low = 4.0 + dataFromThread.low;
	data.close = 5.0 + dataFromThread.close;
	emit StartThread();
}

4.主线程

#pragma once

#include <QtWidgets/QMainWindow>
#include <QVariant>
#include "ui_QtRelated.h"
#include "msg.h"
#include "MyThread4.h"
#include "MyThread5.h"

class QtRelated : public QMainWindow
{
    Q_OBJECT

public:
    QtRelated(QWidget *parent = Q_NULLPTR);

private slots:
    void DisplayStruct(QVariant);
    void StartThread();

private slots:
    void on_pbStart_clicked();

private:
    Ui::QtRelatedClass ui;
    MyThread4* thread4;
    MyThread5* thread5;
};
#include "QtRelated.h"

QtRelated::QtRelated(QWidget* parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
    thread4 = new MyThread4();
    thread5 = new MyThread5();

    connect(thread4, SIGNAL(DisplaySignal(QVariant)), thread5, SLOT(DisplayThreadMsg(QVariant)));
    connect(thread5, SIGNAL(StartThread()), this, SLOT(StartThread()));
    connect(thread5, 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::StartThread()
{
    if (thread5 != nullptr)
    {
        thread5->start();
    }
}

void QtRelated::on_pbStart_clicked()
{
    if (thread4 != nullptr)
    {
        thread4->start();
    }
}

5.运行效果

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值