Qt进度条的两种实现方式

1、通过QProgressBar实现

Header:     #include <QProgressBar> 
qmake:      QT += widgets
Inherits:   QWidget

QProgressBar继承自QWidget,可以在ui设计中找到。在这里插入图片描述
实现效果如下图:
在这里插入图片描述

Qt助手中还描述很多用法,比如将文字显示在进度条上、隐藏进度现实,隐藏进度条等等。

直接在ui文件中拖4个QProgressBar,分别命名为progressBarR,progressBarL,progressBarU
progressBarD,再拖两个按钮,用来启动和复位。

实现代码:

#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow){
    
    
    ui->setupUi(this);
    //向右
    ui->progressBarR->setRange(0,255);
    ui->progressBarR->setValue(0);
    ui->progressBarR->setOrientation (Qt::Horizontal);
    //向左
    ui->progressBarL->setRange(0,255);
    ui->progressBarL->setValue(0);
    ui->progressBarL->setInvertedAppearance(true); 
    //向上
    ui->progressBarU->setRange(0,255);
    ui->progressBarU->setValue(0);
    ui->progressBarU->setOrientation (Qt::Vertical);
    //向下
    ui->progressBarD->setRange(0,255);
    ui->progressBarD->setValue(0);
    ui->progressBarD->setOrientation (Qt::Vertical);
    ui->progressBarD->setInvertedAppearance(true); 
}
void MainWindow::on_startButton_clicked(){
    
    
    for(int i=1;i<256;i++){
    
    
        ui->progressBarR->setValue(i);
        ui->progressBarL->setValue(i);
        ui->progressBarU->setValue(i);
        ui->progressBarD->setValue(i);
    }
}
void MainWindow::on_resetButton_clicked()
{
    
    
    ui->progressBarR->reset();
    ui->progressBarL->reset();
    ui->progressBarU->reset();
    ui->progressBarD->reset();
}

最大值最小值都为0的时候,就是的状态
在这里插入图片描述

2、通过QProgressDialog实现

Header:    #include <QProgressDialog> 
qmake:     QT += widgets
Inherits:  QDialog

QProgressDialog继承自QDialog,是一个对话框,实现的效果为
在这里插入图片描述
同样的方式在visual stdio中正常运行,然而在qtcreator中cancel按钮不灵敏,要点击好几次才起作用。原因暂时未知,求大佬指点。
在进度条到100%时窗口会自动关闭。在进度条前进的过程中可以通过cancel按钮实现交互,按下按钮之后wasCanceled()返回值变为true且之后一直为true
.h文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QProgressDialog>

QT_BEGIN_NAMESPACE
namespace Ui {
    
     class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    
    
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_startButton_clicked();

private:
    Ui::MainWindow *ui;
    QProgressDialog progressDialog;
};
#endif // MAINWINDOW_H

.cpp文件

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QThread>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow){
    
    
    ui->setupUi(this);
    progressDialog.setWindowTitle("progress dialog test");
    progressDialog.setLabelText("wait...");
    progressDialog.setCancelButtonText("cancel");
    progressDialog.setRange(0,255);
    //progressDialog.autoClose();
    progressDialog.showNormal();
}

MainWindow::~MainWindow(){
    
    
    delete ui;
}

void MainWindow::on_startButton_clicked(){
    
    
    for(int i=0;i<256;i++){
    
    
        progressDialog.setValue(i);
        if(progressDialog.wasCanceled()){
    
    //取消为true
            progressDialog.reset();
            break;
        }
        QThread::msleep(5);
    }
}

最后附上在visual stdio中的实现(和上面是一样的)

int main(int argc, char** argv)
{
    
    
    QApplication a(argc, argv);
    QProgressDialog qProgress("please wait...","cancel",0,100); 
    qProgress.autoClose();
    for (int i = 0; i <= 100; i++) {
    
    
        qProgress.setValue(i);
        cv::waitKey(100);
        if (qProgress.wasCanceled()) {
    
    
            //点击cancel
        }
    }
}

猜你喜欢

转载自blog.csdn.net/dongdong_csdn/article/details/103915162
今日推荐