• 进度条的使用


      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 #coding: utf-8
     2 from PyQt4.QtCore import *
     3 from PyQt4.QtGui import *
     4 import sys
     5 
     6 QTextCodec.setCodecForTr(QTextCodec.codecForName("utf8"))
     7 
     8 class Progess(QDialog):
     9     def __init__(self, parent=None):
    10         super(Progess, self).__init__(parent)
    11         self.setWindowTitle(self.tr("进度条"))
    12         numLabel = QLabel(self.tr("文件数目"))
    13         self.numLineEdit = QLineEdit("10")
    14         typeLabel = QLabel(self.tr("显示类型"))
    15         self.typeComboBox = QComboBox()
    16         self.typeComboBox.addItem(self.tr("进度条"))
    17         self.typeComboBox.addItem(self.tr("进度对话框"))
    18 
    19         self.progressBar = QProgressBar()
    20 
    21         startPushButton = QPushButton(self.tr("开始"))
    22 
    23         layout = QGridLayout()
    24         layout.addWidget(numLabel, 0, 0)
    25         layout.addWidget(self.numLineEdit, 0, 1)
    26         layout.addWidget(typeLabel, 1, 0)
    27         layout.addWidget(self.typeComboBox, 1, 1)
    28         layout.addWidget(self.progressBar, 2, 0, 1, 2)
    29         layout.addWidget(startPushButton, 3, 1)
    30         layout.setMargin(15)
    31         layout.setSpacing(10)
    32 
    33         self.setLayout(layout)
    34 
    35         self.connect(startPushButton, SIGNAL("clicked()"), self.slotStart)
    36 
    37 
    38     def slotStart(self):
    39         num = int(self.numLineEdit.text()) #获得当前需要复制的文件数目,这里对应进度条的总的步进值
    40         #采用进度条的方式显示进度
    41         if self.typeComboBox.currentIndex() == 0:
    42             self.progressBar.setMinimum(0)
    43             self.progressBar.setMaximum(num)
    44 
    45             for i in range(num):
    46                 self.progressBar.setValue(i)
    47                 QThread.msleep(100)
    48         #采用进度对话框的方式显示进度
    49         elif self.typeComboBox.currentIndex() == 1:
    50             progressDialog = QProgressDialog(self) #创建一个进度对话框
    51             progressDialog.setWindowModality(Qt.WindowModal) #设置进度对话框采用模态方式进行显示,即显示进度的同时,其他窗口将不响应输入信号。
    52             progressDialog.setMinimumDuration(5) #设置进度对话框出现等待时间,此处设定为 5 秒,默认为 4 秒
    53             progressDialog.setWindowTitle(self.tr("请等待"))
    54             progressDialog.setLabelText(self.tr("拷贝..."))
    55             progressDialog.setCancelButtonText(self.tr("取消"))
    56             progressDialog.setRange(0, num)
    57             #在实际中使用文件复制过程来替换, 进度条的总的步进值为需要复制的文件数目,
    58             # 当复制完一个文件后,步进值增加 1,这里需要使用 processEvents()来正常响应事件循环,
    59             # 以确保应用程序不会出现阻塞。
    60             for i in range(num):
    61                 progressDialog.setValue(i)
    62                 QThread.msleep(100)
    63                 if progressDialog.wasCanceled(): #检测“取消”按钮是否被触发,若触发则退出循环并关闭进度对话框,在实际中,此处还需进行相关的清理工作
    64                     return
    65 
    66 app = QApplication(sys.argv)
    67 proressbar = Progess()
    68 proressbar.show()
    69 app.exec_()

    进度对话框的使用有两种方法, 即模态方式与非模态方式。 本实例中使用的是模态方式,模态方式的使用比较简单方便,但必须使用 processEvents 来使事件循环保持正常进行状态,从而确保应用不会阻塞。若使用非模态方式,则需要通过 QTime 来现定时设置进度条的值。



  • 相关阅读:
    MT7621 将gpio对应pin设置gpio模式
    openwrt jshn.h 详细用法数组遍历
    sql时间处理(使用函数DATEPART和STR)
    (1)Node.js 与 NPM 的 介绍、安装配置
    The elements in the "SELECT LIST" list must be separated using commas.
    1085. 【GDOI2008】彩球游戏
    3283. 【GDOI2013】大山王国的科举考试
    01.17~01.27 总结
    5190. 【NOI2017模拟7.1】景中人
    3647. 【GDOI2014】oj
  • 原文地址:https://www.cnblogs.com/nju2014/p/4515127.html
Copyright © 2020-2023  润新知