定时器和多线程的使用:
注意:创建多线程需要加上新的线程类
1、创建一个新的线程类MyThread
头文件.h
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread>
class MyThread : public QThread
{
Q_OBJECT//注意这边,当需要用到信号和槽的时候,都需要加上这个
public:
explicit MyThread();
~MyThread();
protected:
//QThread的虚函数
//线程处理函数
//不能直接调用,通过start()间接调用
void run();
signals:
void isDone(); //处理完成信号
};
#endif // MYTHREAD_H
在源文件.cpp中:
#include "mythread.h"
MyThread::MyThread()
{
}
MyThread::~MyThread()
{
}
void MyThread::run()
{
//很复杂的数据处理
//需要耗时5秒
sleep(5);
emit isDone(); //发送完成信号
}
2、新建MyWidget的类,然后再添加上
在.h文件中:
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
#include <QTimer>
#include "mythread.h" //线程头文件
namespace Ui {
class MyWidget;
}
class MyWidget : public QWidget
{
Q_OBJECT
public:
explicit MyWidget(QWidget *parent = 0);
~MyWidget();
void dealTimeout(); //定时器槽函数
void dealDone(); //线程槽函数
void stopThread(); //停止线程
private slots:
void on_pushButton_clicked();
private:
Ui::MyWidget *ui;
QTimer *myTimer; //声明变量
MyThread *thread; //线程对象
};
#endif // MYWIDGET_H
在.cpp文件中
#include "mywidget.h"
#include "ui_mywidget.h"
//#include <QDebug>
MyWidget::MyWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MyWidget)
{
ui->setupUi(this);
myTimer = new QTimer(this);//创建一个定时器
thread = new MyThread(); //分配空间
//QThread *thread = new QThread(this);
//只要定时器启动,自动触发timeout
connect(myTimer, &QTimer::timeout, this, &MyWidget::dealTimeout);
connect(thread, &MyThread::isDone, this, &MyWidget::dealDone);
//当按窗口右上角x时,触发destroyed信号
connect(this, &MyWidget::destroyed, this, &MyWidget::stopThread);
}
MyWidget::~MyWidget()
{
delete ui;
}
void MyWidget::on_pushButton_clicked()
{
//若定时器没有工作
if(myTimer->isActive() == false)
{
myTimer->start(100);
}
//启动线程,处理数据
thread->start();
}
void MyWidget::dealTimeout()
{
static int i = 0;
i++;
//设置lcd的值
ui->lcdNumber->display(i);
}
void MyWidget::dealDone()
{
// qDebug() << "it is over"; //打印线程结束信息
myTimer->stop(); //关闭定时器
}
void MyWidget::stopThread()
{
//停止线程
thread->quit();
//等待线程处理完手头工作
thread->wait();
}
在main函数中:
#include "mywidget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyWidget w;
w.show();
return a.exec();
}
最后出现的界面为:
参考文献:https://www.cnblogs.com/coolcpp/p/qt-thread.html