使用进度条

Qt提供两种显示进度条方式,QProgressBar和QProgressDialog

QProgressBar类提供了一种横向或纵向显示进度的控件表示,用来描述任务的完成情况



QProgressDialog类提供了一种针对慢速过程的进度对话框表示方式,用于描述任务完成的进度情况。


QProgressBar的几个重要属性值:

minimum:进度条指示的最小值

maximum:进度条指示的最大值

format:进度条显示文字的格式,3种格式

%p%:显示完成的百分比(默认)

%v:显示当前进度值

%m:显示总的步进值

invertedAppearance属性可以让进度条以反向显示进度


QProgressDialog的几个重要属性:

minimum:进度条指示的最小值

maximum:进度条指示的最大值

minimunDuration:进度条对话框出现前的等待时间,系统根据所需要完成的工作量估算一个预计花费的时间,若大于设定的等待时间minimumDuration,则出现进度条对话框,若小于则不出现。


步进值:一旦设置好了进度条的最大值和最小值,进度条会显示完成的步进值占总的步进值的百分比

公式为:

百分比=(value()-minimum())/(maximum()-minimum())


源码:

main.cpp

#include<QApplication>
#include"progress.h"
int main(int argc,char *argv[])
{

QApplication app(argc,argv);
Progress *pr = new Progress();
pr->show();
return app.exec();
}

----------------------------------------------------------------------------

progress.h

#ifndef PROGRESS_H
#define PROGRESS_H
#include<QtGui>
class Progress:public QDialog
{
Q_OBJECT
public:
Progress(QWidget *parent=0,Qt::WindowFlags f=0);
public:
QLabel *numLabel;
QLineEdit *numLineEdit;
QLabel *typeLabel;
QComboBox *typeComboBox;


QProgressBar *progressBar;
QPushButton *startPushButton;

private:
void slotStart();
};
#endif

-----------------------------------------------------------------------------------

progress.cpp

#include"progress.h"
Progress::Progress(QWidget *parent,Qt::WindowFlags f):QDialog(parent,f)
{
QFont font("ZYSong18030",12);
setFont(font);

setWindowTitle(tr("Progress"));//主框体显示

numLabel = new QLabel(tr("File num"));
numLineEdit = new QLineEdit;
numLineEdit->setText(tr("10"));


typeLabel = new QLabel(tr("progress type"));
typeComboBox = new QComboBox;//下拉列表框
typeComboBox->addItem(tr("progressbar"));//添加元素
typeComboBox->addItem(tr("progressdialog"));


progressBar = new QProgressBar;

startPushButton = new QPushButton(tr("start"));


QGridLayout *layout = new QGridLayout(this);
layout->addWidget(numLabel,0,0);
layout->addWidget(numLineEdit,0,1);
layout->addWidget(typeLabel,1,0);
layout->addWidget(typeComboBox,1,1);
layout->addWidget(progressBar,2,0,1,2);//前两个参数表示位置(第几行第几列),后两个参数表示该控件占几行几列;
layout->addWidget(startPushButton,3,1);
layout->setMargin(15);
layout->setSpacing(10);


connect(startPushButton,SIGNAL(clicked()),this,SLOT(slotStart()));
}
void Progress::slotStart()
{
int num = numLineEdit->text().toInt();//获得当前需要复制的文件数目,对应进度条总的步进值


if(typeComboBox->currentIndex()==0)//采用进度条方式显示
{
progressBar->setRange(0,num);//设置步进范围从0到需要复制的文件数目
for(int i=1;i<num+1;i++)
{
progressBar->setValue(i);

/*此处模拟文件复制过程*/
sleep(1);
}
}
else if(typeComboBox->currentIndex()==1)//采用进度条对话框方式
{
QProgressDialog *progressDialog = new QProgressDialog(this);//创建
QFont font("ZYSong18030",12);
progressDialog->setFont(font);
progressDialog->setWindowModality(Qt::WindowModal);//设置进度条对话框曹勇模态方式进行显示,显示进度的同时,其他窗口不响应输入信号
progressDialog->setMinimumDuration(5);//设定等待时间
progressDialog->setWindowTitle(tr("please wait"));
progressDialog->setLabelText(tr("copying..."));
progressDialog->setCancelButtonText(tr("cancel"));
progressDialog->setRange(0,num);//设置步进范围

for(int i=1;i<num+1;i++)
{
progressDialog->setValue(i);//正常响应时间循环,确保程序不会出现阻塞
qApp->processEvents();
sleep(1);
if(progressDialog->wasCanceled())//检测取消按钮是否触发
{
return;
}
}
}
}

进度对话框的使用有两种方法,模态方式和非模态方式,模态方式使用比较简单,但必须用QApplication::progressEvents()来使事件循环并保持正常状态,从而确保程序不会阻塞,若使用非模态方式则需要通过QTime来实现定时设置进度条的值。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值