注释先不写了,直接上代码
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