本文介绍子线程与子线程之间的信号槽处理机制。
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.运行效果

508

被折叠的 条评论
为什么被折叠?



