当处理复杂的数据时,此时耗时间,需要多任务处理 就需要用到线程了
qt中使用线程的方法 ,自定义一个类继承QThread
QThread 类中有个虚函数
void run()才是线程中的处理函数 我们需要重写该函数
但启动线程 不能直接调用run函数,需要通过线程类的start()函数来间接调用run函数
按f4可直接快捷跳转到构造函数中,
按f1可直接跳转到该类的文档中
线程启动调用start()函数
关于关闭线程 有两个函数一个是terminate() 另一个是quit函数
terminate()函数有可能线程运行到一半给你关了,不稳定
而quit函数确保线程运行完后再关闭强烈建议使用
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread>
class Mythread : public QThread
{
Q_OBJECT
public:
explicit Mythread(QObject *parent = nullptr);
protected:
//qthread的虚函数
//线程处理函数
//不能直接调用,通过start间接调用
virtual void run();
signals:
void isdone();
};
#endif // MYTHREAD_H
#include "mythread.h"
Mythread::Mythread(QObject *parent)
: QThread{parent}
{}
void Mythread::run()
{
//复杂的数据处理,需要耗时
sleep(5);//等待5s
emit isdone();
}
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTimer>
#include "mythread.h"
QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_pushButton_clicked();
private:
Ui::Widget *ui;
QTimer* timer;
Mythread *thread;//线程对象 调用自定义的类继承了qthread
};
#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
timer = new QTimer(this);
connect(timer,&QTimer::timeout,this,[=](){
static int num =1;
ui->lcdNumber->display(num++);
});
thread = new Mythread(this);
connect(thread,&Mythread::isdone,this,[=](){
timer->stop();
});
thread->quit();
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked()
{
timer->start(100);
//点击时启动线程 处理数据
thread->start();
}
这个程序的运行效果就是按钮按下后计数器开始计数,当5s过后计数暂停
暂停后计数为45
标签:Widget,多线程,QT,void,Mythread,线程,include,函数 From: https://blog.csdn.net/qq_73937769/article/details/141191641