QThread结合QProgressBar使用示例

QThread结合QProgressBar使用示例

为了显示任务处理时的实时进度,所以使用了多线程后台处理数据,在前台使用QProgressBar显示实时处理的进度。

  1. 添加一个进度条显示框 add new "Qt设计师类"

progressdlg.h

#include <QDialog>
#include <QTimer>

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(pv<pu){
            pv++;
        } else {
            sat->stop();
        }
        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);
}
  1. 添加一个新线程类 add new "C++ class"

myThread.h




#ifndef TESTTHREAD_H
#define TESTTHREAD_H


/**
 * 这是一个试验多线程类: 模拟一个数据处理过程
 * 在这个过程中共汇报4次进度。(即,向主程序发送4次信号)
 *
 *
 **/



#include <QThread>
#include <QDebug>

#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);

}
  1. 在主文件中添加两个类并执行
    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;
	
posted @ 2022-01-24 15:18  看不见的R  阅读(216)  评论(0编辑  收藏  举报