Qt提供了两种显示进度条的方式:
1.一种是QProgressBar,提供了一种横向或纵向显示进度的控件表示方式;
其有几个重要的属性:
(1) minimum、maximum决定进度条指示的最小值和最大值
(2) format决定进度条显式文字的格式,可以有三种显式方式,即%p%,%v,%m。其中,%p%显示完成的百分比,这是默认显示方式;%v显示当前的进度值;%m显示总的步进值。
(3)invertedAppearance 可以使进度条以反方向显示进度。
还有一种是QProgressDiolog,提供了一种针对慢速过程的进度对话框表示方式,都用来用来描述任务的完成情况。
其有几个重要的属性:
(1) mininum、maximum 表示进度条的最大值和最小值,决定了进度条的变化范围
(2) mininumDuration为进度条对话框出现的等待时间
2.进度条对话框的使用方法有模态和非模态两种方式。
模态方式:使用 QApplication::processEvent() 使事件循环保持正常进行状态,确保应用不会阻塞
非模态方式:需用QTime实现定时设置进度条的值。
.h
#ifndef PROGRESSDLG_H
#define PROGRESSDLG_H
#include
#include
#include
#include
#include
#include
#include
class ProgressDlg : public QDialog
{
Q_OBJECT
public:
ProgressDlg(QWidget *parent = nullptr);
~ProgressDlg();
private slots:
void startProgress();
private:
QLabel *labFileNum;
QLineEdit *lineFileNum;
QLabel *labProgressType;
QComboBox *comboBox;
QProgressBar *progressBar;
QPushButton *btnStar;
QGridLayout *mainLayout;
};
#endif // PROGRESSDLG_H
.cpp
#include "progressdlg.h"
#include
ProgressDlg::ProgressDlg(QWidget *parent)
: QDialog(parent)
{
QFont font("ZYSong18030",12);
setFont(font);
setWindowTitle(QStringLiteral("Progress"));
labFileNum=new QLabel;
labFileNum->setText(QStringLiteral("文件数目"));
lineFileNum=new QLineEdit;
lineFileNum->setText(QStringLiteral("100000"));
labProgressType=new QLabel;
labProgressType->setText(QStringLiteral("显式类型"));
comboBox=new QComboBox;
comboBox->addItem(QStringLiteral("progressBar"));
comboBox->addItem(QStringLiteral("progressDialog"));
progressBar=new QProgressBar;
btnStar=new QPushButton;
btnStar->setText(QStringLiteral("开始"));
mainLayout=new QGridLayout(this);
mainLayout->addWidget(labFileNum,0,0);
mainLayout->addWidget(lineFileNum,0,1);
mainLayout->addWidget(labProgressType,1,0);
mainLayout->addWidget(comboBox,1,1);
mainLayout->addWidget(progressBar,2,0,1,2);
mainLayout->addWidget(btnStar,3,0);
mainLayout->setMargin(15);
mainLayout->setSpacing(10);
connect(btnStar,&QPushButton::clicked,[this](){ startProgress();});
}
ProgressDlg::~ProgressDlg()
{
}
void ProgressDlg::startProgress()
{
bool ok;
int num=lineFileNum->text().toInt(&ok);//获取当前需要复制的文件数目
if(comboBox->currentIndex()==0) //采用进度条的方式显示进度
{
progressBar->setRange(0,num); //设置进度条的步进范围从0到需要复制的文件数目
for(int i=1;isetValue(i); //模拟每一个文件的复制过程
//进度条总的步进值为需要复制的文件数目。当复制完一个文件后,步进值加1
}
}
else if(comboBox->currentIndex()==1)//采用进度进度对话框的方式显示进度
{
//创建一个进度对话框
QProgressDialog *progressDialog=new QProgressDialog;
QFont font("ZYSong18030",12);
progressDialog->setFont(font);
progressDialog->setWindowModality(Qt::WindowModal);//设置模态显示方式
progressDialog->setMinimumDuration(5);//对话框出现需要等待的时间
progressDialog->setWindowTitle(QStringLiteral("Please Wait"));
progressDialog->setLabelText(QStringLiteral("Copying....."));
progressDialog->setCancelButtonText(QStringLiteral("Cancel"));
progressDialog->setRange(0,num);
for(int i=1;isetValue(i);
if(progressDialog->wasCanceled())
return;
}
}
}