考慮程序的友好性,當程序在執行一項耗時操作時,界面應告訴用戶“程序還在運行中”,那麼,QT中進度對話框(QProgressDialog)可以滿足要求。
(1) 如果所耗總時間已知,則不需要藉助定時器。
QProgressDialog dialog(tr("文件複製進度"), tr("取消"), 0, 50000, this);
dialog.setWindowTitle(tr("進度對話框"));
dialog.setWindowModality(Qt::WindowModal);
dialog.show();
for(int i = 0; i < 50000; i++)//已知最大值不超過50000
{
dialog.setValue(i);
QCoreApplication::processEvents();
if(dialog.wasCanceled())
break;
}
dialog.setValue(50000);
qDebug()<<tr("複製結束!");
(2) 如果所耗總時間無法估計,則需要藉助定時器, 做一個“沒有終點”的進度對話框。
詳細源代碼請參考,不需要積分喔:
http://download.csdn.net/detail/learn_sunzhuli/8757715
progDlg = new QProgressDialog();
progDlg->setWindowTitle("Please wait...");
progDlg->setFixedWidth(300);
progDlg->setRange(0, 100);
progDlg->show();
timer = new QTimer();
currentValue = 0;
progDlg->setValue(currentValue);
connect(timer, SIGNAL(timeout()), this, SLOT(updateProgressDialog()));
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)運行效果圖: