添加一个进度条,在子线程里过一段时间发个信号给主线程更新进度条。
#include "threaad.h"
threaad::threaad(QObject *parent)
:QObject(parent)
{
}
void threaad::doWork()
{
for(int i = 0; i < 1000000;++i)
{
if(i % 100000 == 0)
{
emit sendNum(i);
QThread::msleep(100);
}
}
emit workFinsh();
}
这里和继承QThread不一样,QThread运行完run()之后会发一个finished()信号,这里要自定义一个workFinsh()
#include "widget.h"
#include "ui_widget.h"
#include "threaad.h"
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
ui->progressBar->setRange(0,1000000);
oneThread = new threaad;//这里不能设置父对象否则不能移到线程里
oneThread->moveToThread(&workerThread);
// connect(&workerThread, &QThread::finished, oneThread, &QObject::deleteLater);
connect(this,&Widget::threadStartWork,oneThread,&threaad::doWork);
connect(oneThread,&threaad::sendNum,this,&Widget::updateProgressBar);
connect(oneThread,&threaad::workFinsh, this, [this]
{
ui->progressBar->setValue(1000000);
workerThread.quit();
workerThread.wait();
qDebug()<<"线程退出了";
});
}
Widget::~Widget()
{
if(workerThread.isRunning())
{
workerThread.quit();
workerThread.wait();
}
delete ui;
}
void Widget::on_pushButton_clicked()
{
ui->progressBar->setValue(0);
if(!workerThread.isRunning())
{
workerThread.start();
qDebug()<<"线程启动了";
}
emit threadStartWork();//运行子线程
}
void Widget::updateProgressBar(int index)
{
ui->progressBar->setValue(index);
}