PyQt4 精彩例項分析* 例項8 使用進度條
通常在處理長時間任務時需要提供進度條的顯示,告訴使用者當前任務的進展情況。本例項演示如何使用進度條,如下圖所示。
Qt提供了兩種顯示進度條的方式,一種是QProgressBar,另一種是QProgressDialog,QProgressBar類提供了種橫向或縱向顯示進度條的控制元件表示方式,用來描述任務的完成情況。QProgressDialog類提供了一種針對慢速過程的進度對話方塊表示方式,用於描述任務完成的進度情況。標準的進度條對話方塊包括一個進度顯示條,一個取消按鈕以及一個標籤。
QProgressBar有幾個重要的屬性值,minimum,maximum決定進度條提示的最小值和最大值,format決定進度條顯示文字的格式,可以有3種顯示格式:%p%,%v,%m。%p%顯示完成的百分比,這是預設顯示方式;%v顯示當前的進度值;%m顯示總的步進值。invertedAppearance屬性可以讓進度條以反方向顯示進度。
QProgressDialog也有幾個重要的屬性值,決定了進度條對話方塊何時出現,出現多長時間,分別是minimum,maximum和minimumDuration。minimum和maximum分別表示進度條的最小值和最大值,決定了進度條的變化範圍,minimumDuration為進度條對話框出現前的等待時間。系統根據所需完成的工作量估算一個預計花費的時間,若大於設定的等待時間minimumDuration,則出現進度條對話方塊;若小於設定的等待時間,則不出現進度條對話方塊。
進度條使用了一個步進值的概念,即一時設定好進度條的最大值和最小值,進度條將會顯示完成的步進值佔總的步進值的百分比,百分比的計算公式為:
百分比=(value()-minimum())/(maximum()-minimum())
本例具體實現程式碼如下:
# -*- coding: utf-8 -*- from PyQt4.QtGui import * from PyQt4.QtCore import * import sys QTextCodec.setCodecForTr(QTextCodec.codecForName("utf8")) class Progess(QDialog): def __init__(self,parent=None): super(Progess,self).__init__(parent) self.setWindowTitle(self.tr("使用進度條")) numLabel=QLabel(self.tr("檔案數目")) self.numLineEdit=QLineEdit("10") typeLabel=QLabel(self.tr("顯示型別")) self.typeComboBox=QComboBox() self.typeComboBox.addItem(self.tr("進度條")) self.typeComboBox.addItem(self.tr("進度對話方塊")) self.progressBar=QProgressBar() startPushButton=QPushButton(self.tr("開始")) layout=QGridLayout() layout.addWidget(numLabel,0,0) layout.addWidget(self.numLineEdit,0,1) layout.addWidget(typeLabel,1,0) layout.addWidget(self.typeComboBox,1,1) layout.addWidget(self.progressBar,2,0,1,2) layout.addWidget(startPushButton,3,1) layout.setMargin(15) layout.setSpacing(10) self.setLayout(layout) self.connect(startPushButton,SIGNAL("clicked()"),self.slotStart) def slotStart(self): num=int(self.numLineEdit.text()) if self.typeComboBox.currentIndex()==0: self.progressBar.setMinimum(0) self.progressBar.setMaximum(num) for i in range(num): self.progressBar.setValue(i) QThread.msleep(100) elif self.typeComboBox.currentIndex()==1: progressDialog=QProgressDialog(self) progressDialog.setWindowModality(Qt.WindowModal) progressDialog.setMinimumDuration(5) progressDialog.setWindowTitle(self.tr("請等待")) progressDialog.setLabelText(self.tr("拷貝...")) progressDialog.setCancelButtonText(self.tr("取消")) progressDialog.setRange(0,num) for i in range(num): progressDialog.setValue(i) QThread.msleep(100) if progressDialog.wasCanceled(): return app=QApplication(sys.argv) progess=Progess() progess.show() app.exec_()
第38行獲得當前需要複製的檔案數目,這裡對應進度條的總的步進值。
第40-46行採用進度條的方式顯示進度。
第41,42行設定進度條的步進範圍從0到需要複製的檔案數目。
第45,46行模擬每一個檔案的複製過程,這裡通過QThread.msleep(100)來模擬,在實際中使用檔案複製過程來替換,進度條的總的步進值為需要複製的檔案數目,當複製完成一個檔案後,步進值增加1。
第48-61行採用進度對話方塊的方式顯示進度。
第49行建立一個進度對話方塊。
第50行設定進度對話方塊採用模態方式進行顯示,即顯示進度的同時,其他視窗將不響應輸入訊號。
第51 行設定進度對話框出現等待時間,此處設定為5秒,預設為4秒。
第52-54行設定進度對話方塊的窗體標題,顯示文字資訊以及取消按鈕的顯示文字。
第55行設定進度對話方塊的步進範圍。
第57-61行模擬每一個檔案複製過程,這裡通過QThread.msleep(100)進行模擬,在實際中使用檔案複製過程來替換,進度條的總的步進值為需要複製的檔案數目,當複製完一個檔案後,步進值增加1,這裡需要使用processEvents()來正常響應事件迴圈,以確保應用程式不會出現阻塞。
第60,61行檢測“取消”按鈕是否被觸發,若觸發則退出迴圈並關閉進度對話方塊,在實際應用中,此處還需進行相關的清理工作。
進度對話方塊的使用有兩種方法,即模態方式與非模態方式。本例項中使用的是模態方式,模態方式的使用比較簡單方便,但必須使用processEvents來使事件迴圈保持正常進行狀態,從而確保應用不會阻塞。若使用非模態方式,則需要通過QTime來實現定時設定進度條的值。