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
}
}
}