QT 线程,QThread,给子线程发消息,给主线程发消息

 注释先不写了,直接上代码

mythread.h 
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread>

class MyThread : public QThread
{
    Q_OBJECT
public:
    explicit MyThread(QObject *parent = 0);
    void flagStatus();

protected:
    //QThread的虚函数
    //线程处理函数
    //不能直接调用,通过start()间接调用
    void run();

signals:
    //给主线程发消息
    void sendMsgToMain(int);

public slots:
    //接收主线程的消息
    void recMegFromMain(QString);
};

#endif // MYTHREAD_H
mythread.cpp
#include "mythread.h"
#include <QDebug>

//用来判断线程退出的标志
int myFlag = 1;

MyThread::MyThread(QObject *parent) : QThread(parent)
{

}

void MyThread::run()
{
    myFlag = 1;
    int i = 0;
    while(myFlag)
    {
        sleep(1);
        i++;
        emit sendMsgToMain(i);
    }
}

void MyThread::flagStatus()
{
      myFlag = 0;
}

void MyThread::recMegFromMain(QString str)
{
    qDebug()<<str;
}
widget.h 
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTimer>
#include <QPushButton>
#include "mythread.h"

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

    void stopThread(); //停止线程槽函数

private slots:
    void onPushButtonClicked();
    void receiveMsgFromThread(int i);
    void stopThreadFromBtn(); //停止线程槽函数
    void sengMsgToThreadBtn();

private:
    Ui::Widget *ui;

    MyThread *thread;

signals:
    //给子线程发消息
    void sengMsgToThread(QString);
};

#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QThread>
#include <QDebug>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{

    ui->setupUi(this);

    //创建线程
    thread = new MyThread(this);

    //关闭界面时,杀死线程
    connect(this,&Widget::destroyed,this,&Widget::stopThread);

    //开始线程
    connect(ui->startBtn,SIGNAL(clicked()),this,SLOT(onPushButtonClicked()));
    //按钮结束线程
    connect(ui->exitBtn,SIGNAL(clicked()),this,SLOT(stopThreadFromBtn()));

    //点击按钮给子线程发消息,会调用sengMsgToThread
    connect(ui->sendMsgBtn,SIGNAL(clicked()),this,SLOT(sengMsgToThreadBtn()));

    //接收子线程发来的数据
    connect(thread, &MyThread::sendMsgToMain, this, &Widget::receiveMsgFromThread);

    //发数据给子线程
    connect(this, &Widget::sengMsgToThread, thread, &MyThread::recMegFromMain);
}


Widget::~Widget()
{
    delete ui;
}

void Widget::stopThread()
{
    //停止线程
    thread->quit();
    //等待线程处理完手上的事情
    //在线程还未结束的时候会假死
    thread->wait();
}

void Widget::stopThreadFromBtn()
{
    //停止线程
    thread->quit();
    //打断线程中的死循环
    thread->flagStatus();
}


void Widget::onPushButtonClicked()
{
    qDebug()<<"onPushButtonClicked";
     //启动线程,处理数据
     thread->start();
}


//接收线程函数
void Widget::receiveMsgFromThread(int i)
{
    QString str = QString::number(i);
    qDebug()<<str;
    ui->lineEdit->setText(str);
}


void Widget::sengMsgToThreadBtn()
{
    emit sengMsgToThread("hello");
}
main.cpp
#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

 

参考链接:

1、https://www.cnblogs.com/yuweifeng/p/9384728.html

2、https://blog.csdn.net/Chorzen/article/details/82561637

 

 

 

 

 

  • 4
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值