【转】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 来实现定时设置进度条的值。

posted @ 2014-11-17 14:44  jakey.chen  阅读(1783)  评论(0)    收藏  举报