PyQt5 进度对话框

进度对话框

进度对话框隶属于QProgressDialog类,QProgressDialog类提供了有关缓慢操作进度的反馈。
使用进度对话框给用户说明操作需要花费多长时间,并表明应用程序尚未冻结。它也可以给用户一个中止操作的机会。
进度对话的一个常见问题是很难知道何时使用它们;操作在不同的硬件上花费的时间不同。QProgressDialog提供了一个解决这个问题的方法:它估计操作所花费的时间(基于步骤的时间),并且只有当该估计值超出minimumDuration() (默认为4秒)时才显示。
使用setMinimum() 和setMaximum() 或构造函数来设置操作中的“steps”数量,并在操作进行时调用setValue()。步数可任意选择。它可以是复制的文件数,接收到的字节数,迭代次数,或其他合适的单位。进度从setMinimum()设置的值开始,进度对话框显示当您使用setMaximum()设置的值作为参数调用setValue() 时,操作已完成。
对话框自动在操作结束时重置并隐藏自身。使用setAutoReset()和setAutoClose()来更改此行为。请注意,如果设置新的最大值(使用setMaximum()或setRange() )等于当前value(),对话框将不会关闭。
使用QProgressDialog有两种方式:模态和非模态
与非模态的QProgressDialog相比,模态的QProgressDialog更容易用于程序员。循环执行操作,间隔调用setValue(),并使用wasCanceled()检查取消。像我们上面的例子就是这种。

栗子

from PyQt5.QtWidgets import (QApplication, QWidget, QPushButton, QLabel, QLineEdit, QMessageBox, QProgressDialog)
from PyQt5.QtCore import Qt
import sys
class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.resize(300,150)
        self.setWindowTitle("早点毕业吧--进度对话框")

        self.lb = QLabel("文件数量",self)
        self.lb.move(20,40)

        self.bt1 = QPushButton('开始',self)
        self.bt1.move(20,80)

        self.edit = QLineEdit('100000',self)
        self.edit.move(100,40)

        self.show()

        self.bt1.clicked.connect(self.showDialog)

    def showDialog(self):
        num = int(self.edit.text())
        """
我们新建了一个QProgressDialog对象progress,设置它的标题、标签、增加取消的按钮。
        """
        progress = QProgressDialog(self)
        progress.setWindowTitle("请稍等")  
        progress.setLabelText("正在操作...")
        progress.setCancelButtonText("取消")
        """
如果任务的预期持续时间小于minimumDuration,则对话框根本不会出现。这样可以防止弹出对话框,快速完成任务。对于预期超过minimumDuration的任务,对话框将在minimumDuration时间之后或任何进度设置后立即弹出。如果设置为0,则只要设置任何进度,将始终显示对话框。 默认值为4000毫秒,即4秒。
        """
        progress.setMinimumDuration(5)#此属性保留对话框出现之前必须通过的时间。
        """
此属性保留由模态小部件阻止的窗口。
这个属性只对Windows有意义。 模态小部件防止其他窗口中的小部件获取输入。 该属性的值控制在窗口小部件可见时阻止哪些窗口。 窗口可见时更改此属性无效; 您必须首先hide()小部件,然后再次show()。
默认情况下,此属性为Qt.NonModal。
       """
        progress.setWindowModality(Qt.WindowModal)
        """
由上面我们知道:使用setMinimum() 和setMaximum() 或构造函数来设置操作中的“steps”数量,并在操作进行时调用setValue()。setRange(0,num)就是设置其最小和最大值,这里最小值0,最大值num,num是根据输入框中的数字确定的。
 """
        progress.setRange(0,num) 
        for i in range(num):
        """
setValue()该属性持有当前的进度。要使进度对话框按预期的方式工作,您应该首先将此属性设置为QProgressDialog的最大最小值, 您可以在中间调用setValue()任意次数。
通过wasCanceled()判断我们是否按下取消按钮,如果按下则提示失败。若for循环顺利结束,执行else后的语句,表明成功
   """       
            progress.setValue(i) 
            if progress.wasCanceled():
                QMessageBox.warning(self,"提示","操作失败") 
                break
            else:
                progress.setValue(num)
                QMessageBox.information(self,"提示","操作成功")

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

具体运行结果参考:
https://zhuanlan.zhihu.com/p/30283367
谢谢 “学点编程吧”

你可能感兴趣的:(PyQt5,PyQt5)