考虑程序的友好性,当程序在执行一项耗时操作时,界面应告诉用户“程序还在运行中”,那么,QT中进度对话框(QProgressDialog)可以满足要求。
(1) 如果所耗总时间已知,则不需要借助定时器。
QProgressDialog dialog(tr("文件复制进度"), tr("取消"), 0, 50000, this);<br /> dialog.setWindowTitle(tr("进度对话框"));<br /> dialog.setWindowModality(Qt::WindowModal);<br /> dialog.show();<br /> for(int i = 0; i < 50000; i++)//已知最大值不超过50000<br /> {<br /> dialog.setValue(i);<br /> QCoreApplication::processEvents();<br /> if(dialog.wasCanceled())<br /> break;<br /> }<br /> dialog.setValue(50000);<br /> qDebug()<<tr("复制结束!");
(2) 如果所耗总时间无法估计,则需要借助定时器, 做一个“没有终点”的进度对话框。
详细源代码请参考,不需要积分喔:
http://download.csdn.net/detail/learn_sunzhuli/8757715
progDlg = new QProgressDialog();<br /> progDlg->setWindowTitle("Please wait..."); <br /> progDlg->setFixedWidth(300);<br /> progDlg->setRange(0, 100);<br /> progDlg->show();<br /> timer = new QTimer();<br /> currentValue = 0;<br /> progDlg->setValue(currentValue);<br /> connect(timer, SIGNAL(timeout()), this, SLOT(updateProgressDialog()));<br /> timer->start(100);//开启一个没有终点的定时器
//执行耗时操作。。。
//耗时操作完成后,关闭进度对话框
timer->stop();//停止定时器
if(currentValue != 100)
currentValue = 100;
progDlg->setValue(currentValue);//进度达到最大值
delete progDlg;//关闭进度对话框
//借助定时器,不断更新进度条,直到耗时操纵结束
void updateProgressDialog()
{
currentValue++;
if( currentValue == 100 )
currentValue = 0;
progDlg ->setValue(currentValue);
QCoreApplication::processEvents();//避免界面冻结
if(progDlg->wasCanceled())
progDlg->setHidden(true);//隐藏对话框
}
QT进度对话框(QProgressDialog)运行效果图: