QT总结之线程
实现一个计时器
1.创建一个线程类继承thread
mythread.h
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QObject>
class myThread : public QObject
{
Q_OBJECT
public:
explicit myThread(QObject *parent = 0);
//线程处理函数
void myTimeout();
void setFlag(bool flag=true);
signals:
void mySignal();
public slots:
private:
bool isStop;
};
#endif // MYTHREAD_H
mythread.cpp
#include "mythread.h"
#include <QThread>
#include <QDebug>
myThread::myThread(QObject *parent) : QObject(parent)
{
isStop = false;
}
void myThread::myTimeout(){
while(isStop == false){
QThread::sleep(1);
emit mySignal();
qDebug()<<"子线程"<<QThread::currentThread();
if(isStop){
break;
}
}
}
void myThread::setFlag(bool flag){
isStop=flag;
}
2.界面类
widget.h 声明qthread和mythread 变量
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include "mythread.h"
#include <QThread>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
void dealSignal();
signals:
void startThread();
private slots:
void on_start_clicked();
void on_stop_clicked();
private:
Ui::Widget *ui;
myThread *myT;
QThread *thread;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//动态分配空间,不能指定父对象
myT=new myThread;
//创建子线程
thread = new QThread(this);
//把自定义线程,加入到子线程中
myT->moveToThread(thread);
connect(myT, &myThread::mySignal, this ,&Widget::dealSignal);
qDebug()<<QThread::currentThread();
connect(this, &Widget::startThread, myT, &myThread::myTimeout);
}
Widget::~Widget()
{
delete ui;
}
void Widget::dealSignal(){
static int i=0;
i++;
ui->lcdNumber->display(i);
}
void Widget::on_start_clicked()
{
thread->start();
myT->setFlag(false);
//不能直接调用线程处理函数
//myT->myTimeout();
emit startThread();
}
void Widget::on_stop_clicked()
{
myT->setFlag(true);
thread->quit();
thread->wait();
}