QThread结合QProgressBar使用示例
QThread结合QProgressBar使用示例
为了显示任务处理时的实时进度,所以使用了多线程后台处理数据,在前台使用QProgressBar显示实时处理的进度。
- 添加一个进度条显示框 add new "Qt设计师类"
progressdlg.h
#include
#include
namespace Ui {
class ProgressDlg;
}
class ProgressDlg : public QDialog
{
Q_OBJECT
public:
explicit ProgressDlg(QWidget *parent = nullptr);
~ProgressDlg();
QTimer *sat = nullptr;
/** 进度条显示的值 */
int pv = 0; // 当前
int pu = 0; // 目标
public slots:
void showProgress(int); // ---> 指定进度条的值
// ---> 在label 标签中显示信息
void showInfo(QString);
private:
Ui::ProgressDlg *ui;
};
progressdlg.cpp
#include "progressdlg.h"
#include "ui_progressdlg.h"
ProgressDlg::ProgressDlg(QWidget *parent) :
QDialog(parent),
ui(new Ui::ProgressDlg)
{
ui->setupUi(this);
// ---> 无边框
this->setWindowFlags(Qt::FramelessWindowHint);
// ---> 进度置0
ui->progressBar->setValue(0);
sat = new QTimer();
// ---> 用于将进度光滑的显示到指定位置(不是直接显示某个值)
connect(sat, &QTimer::timeout, this,[=]()mutable{
ui->progressBar->setValue(pv);
if(pvstop();
}
if(pv==100){
this->close();
}
});
}
ProgressDlg::~ProgressDlg()
{
delete ui;
}
void ProgressDlg::progressPlus(){
}
void ProgressDlg::showProgress(int pi){
// ---> 将pu值设定为指定的值
pu = pi;
sat->start(20);
}
void ProgressDlg::showInfo(QString str) {
ui->label->clear();
ui->label->setText(str);
}
- 添加一个新线程类 add new "C++ class"
myThread.h
#ifndef TESTTHREAD_H
#define TESTTHREAD_H
/**
* 这是一个试验多线程类: 模拟一个数据处理过程
* 在这个过程中共汇报4次进度。(即,向主程序发送4次信号)
*
*
**/
#include
#include
#define cout qDebug()<<"第"<<__LINE__<<"行: ---> "
class TestThread : public QThread
{
Q_OBJECT
public:
explicit TestThread(QObject *parent = nullptr);
protected:
void run() override;
signals:
void sendPgs(int);
};
#endif // TESTTHREAD_H
myThread.cpp
#include "testthread.h"
TestThread::TestThread(QObject *parent) : QThread(parent)
{
}
void TestThread::run()
{
cout << "开始线程";
cout << "20";
emit sendPgs(20);
QThread::msleep(1500);
cout << "50";
emit sendPgs(50);
QThread::msleep(1500);
cout << "80";
emit sendPgs(80);
QThread::msleep(1500);
cout << "100";
emit sendPgs(100);
}
- 在主文件中添加两个类并执行
ProgressDlg *pdg = new ProgressDlg();
TestThread* mt = new TestThread();
connect(mt, &TestThread::sendPgs, pdg, &ProgressDlg::showProgress);
mt->start();
pdg->exec();
mt->quit();
mt->wait();
delete pdg;
delete mt;