1. 程式人生 > >PyQt4 精彩例項分析* 例項8 使用進度條

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來實現定時設定進度條的值。