【转】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())
本例具体实现代码如下:
1 #!/usr/bin/python 2 # -*- coding: utf-8 -*- 3 4 from PyQt4.QtGui import * 5 from PyQt4.QtCore import * 6 import sys 7 8 9 QTextCodec.setCodecForTr(QTextCodec.codecForName("utf8")) 10 11 class Progess(QDialog): 12 def __init__(self, parent=None): 13 super(Progess,self).__init__(parent) 14 self.setWindowTitle(self.tr("Use Progess")) 15 self.numLabel = QLabel(self.tr("File Num:")) 16 self.numLineEdit = QLineEdit("10") 17 self.typeLabel = QLabel(self.tr("Type")) 18 self.typeComboBox = QComboBox() 19 self.typeComboBox.addItem(self.tr("progressBar")) 20 self.typeComboBox.addItem(self.tr("progressDialog")) 21 self.progressBar = QProgressBar() 22 self.startPushButton = QPushButton(self.tr("Start")) 23 24 self.Layout() 25 self.ConnectSignalSolt() 26 27 def Layout(self): 28 layout = QGridLayout() 29 layout.addWidget(self.numLabel, 0, 0) 30 layout.addWidget(self.numLineEdit, 0, 1) 31 layout.addWidget(self.typeLabel, 1, 0) 32 layout.addWidget(self.typeComboBox, 1, 1) 33 layout.addWidget(self.progressBar, 2, 0, 1, 2) 34 layout.addWidget(self.startPushButton, 3, 1) 35 layout.setMargin(15) 36 layout.setSpacing(10) 37 self.setLayout(layout) 38 39 def ConnectSignalSolt(self): 40 self.connect(self.startPushButton, SIGNAL("clicked()"), self.slotStart) 41 42 def slotStart(self): 43 num = int(self.numLineEdit.text()) 44 if self.typeComboBox.currentIndex() == 0: 45 self.progressBar.setMinimum(0) 46 self.progressBar.setMaximum(num) 47 for i in range(num): 48 self.progressBar.setValue(i) 49 QThread.msleep(100) 50 elif self.typeComboBox.currentIndex() == 1: 51 progressDialog = QProgressDialog(self) 52 progressDialog.setWindowModality(Qt.WindowModal) 53 progressDialog.setMinimumDuration(5) 54 progressDialog.setWindowTitle(self.tr("Waiting")) 55 progressDialog.setLabelText(self.tr("Copy......")) 56 progressDialog.setCancelButtonText(self.tr("Cancel")) 57 progressDialog.setRange(0, num) 58 for i in range(num): 59 progressDialog.setValue(i) 60 QThread.msleep(100) 61 if progressDialog.wasCanceled(): 62 return 63 64 def main(): 65 app = QApplication(sys.argv) 66 progess = Progess() 67 progess.show() 68 app.exec_() 69 70 if __name__ == '__main__': 71 main()
第 43 行获得当前需要复制的文件数目,这里对应进度条的总的步进值。
第 45-49 行采用进度条的方式显示进度。
第 45,46行设置进度条的步进范围从 0 到需要复制的文件数目。
第 47,48 行模拟每一个文件的复制过程,这里通过 QThread.msleep(100)来模拟,在实际中使用文件复
制过程来替换,进度条的总的步进值为需要复制的文件数目,当复制完成一个文件后,步进值增加 1。
第 51-62 行采用进度对话框的方式显示进度。
第 51 行创建一个进度对话框。
第 52 行设置进度对话框采用模态方式进行显示,即显示进度的同时,其他窗口将不响应输入信号。
第 53 行设置进度对话框出现等待时间,此处设定为 5 秒,默认为 4 秒。
第 54-57 行设置进度对话框的窗体标题,显示文字信息以及取消按钮的显示文字。
第 57 行设置进度对话框的步进范围。
第 58-60 行模拟每一个文件复制过程,这里通过 QThread.msleep(100)进行模拟,在实际中使用文件复制
过程来替换,进度条的总的步进值为需要复制的文件数目,当复制完一个文件后,步进值增加 1,这里需要使
用 processEvents()来正常响应事件循环,以确保应用程序不会出现阻塞。
第 61,62 行检测“取消”按钮是否被触发,若触发则退出循环并关闭进度对话框,在实际应用中,此处还需进
行相关的清理工作。
进度对话框的使用有两种方法,即模态方式与非模态方式。本实例中使用的是模态方式,模态方式的使用比较
简单方便,但必须使用 processEvents 来使事件循环保持正常进行状态,从而确保应用不会阻塞。若使用
非模态方式,则需要通过 QTime 来实现定时设置进度条的值。

浙公网安备 33010602011771号