如何通过PyQt去构建一个自己的对话框,本期是关键

在上一期中,我们学习了如何通过 PyQt 构建自己的对话框。本期是关于对话框的最后一期,介绍进度对话框。

很多校友在日常办事过程中,由于流程漫长,需要等待一段时间。这时候一般软件都会给出一定的提示,比如:

当然,我们所做的并没有那么酷,是这样的:

虽然有点简单,但是实用啊。

好的,让我们从代码开始。

#coding=utf-8
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())
        progress = QProgressDialog(self)
        progress.setWindowTitle("请稍等")  
        progress.setLabelText("正在操作...")
        progress.setCancelButtonText("取消")
        progress.setMinimumDuration(5)
        progress.setWindowModality(Qt.WindowModal)
        progress.setRange(0,num) 
        for i in range(num):
            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_())

进度对话框属于 QProgressDialog 类,它提供关于慢操作进度的反馈。

使用进度对话框告诉用户操作将花费多长时间并指示应用程序尚未冻结。它还可以给用户一个中止操作的机会。

进度对话框的一个常见问题是很难知道何时使用它们。操作在不同的硬件上需要不同的时间。QProgressDialog 为这个问题提供了一个解决方案:它估计操作所用的时间(基于步骤的时间),并且仅在估计超过 minimumDuration() (默认为 4 秒)时才显示它。

使用 setMinimum() 和 setMaximum() 或构造函数设置操作中的“步数”,并在操作进行时调用 setValue()。步数可以任意选择。它可以是复制的文件数、接收的字节数、迭代次数或其他合适的单位。进度从 setMinimum() 设置的值开始,当您使用 setMaximum() 设置的值作为参数调用 setValue() 时,进度对话框显示操作已完成。

对话框会在操作结束时自动重置并隐藏。使用 setAutoReset() 和 setAutoClose() 来改变这种行为。请注意,如果您将新的最大值(使用 setMaximum() 或 setRange() )设置为等于当前 value(),则对话框不会关闭。

QProgressDialog 有两种使用方式:模态和非模态。

对于程序员来说,模态 QProgressDialog 比非模态 QProgressDialog 更容易使用。该操作在循环中执行,每隔一段时间调用 setValue(),并使用 wasCanceled() 检查取消。就像我们上面的例子一样。

由于无模式进度对话框涉及到其他几个知识点,这里暂不介绍。后面我会结合其他几个知识点讲。

progress = QProgressDialog(self)
progress.setWindowTitle("请稍等")  
progress.setLabelText("正在操作...")
progress.setCancelButtonText("取消")
progress.setMinimumDuration(5)
progress.setWindowModality(Qt.WindowModal)
progress.setRange(0,num)

我们创建一个新的 QProgressDialog 对象进度,设置它的标题、标签,并添加一个取消按钮。

界面

progress.setMinimumDuration(5)

此属性保存对话框出现之前必须经过的时间。

如果任务的预期持续时间小于 minimumDuration模态对话框是什么时候实例的对话框,则根本不会出现对话框。这可以防止弹出对话框并快速完成任务。对于预计超过 minimumDuration 的任务,对话框将在 minimumDuration 时间或任何进度集之后立即弹出。如果设置为 0,则无论何时设置任何进度,都将始终显示对话框。默认值为 4000 毫秒,即 4 秒。

progress.setWindowModality(Qt.WindowModal)

此属性保存被模态小部件阻止的窗口。

此属性仅对 Windows 有意义。模态小部件可防止其他窗口中的小部件获得输入。此属性的值控制在窗口小部件可见时阻止哪些窗口。在窗口可见时更改此属性无效;您必须先 hide() 小部件,然后再 show() 它。

默认情况下,此属性为 Qt.NonModal。其他属性如下:

progress.setRange(0,num)

从上面我们知道:使用 setMinimum() 和 setMaximum() 或者构造函数来设置操作中的“步数”模态对话框是什么时候实例的对话框,并在操作进行时调用 setValue()。setRange(0,num)是设置它的最小值和最大值,其中最小值为0,最大值num,num根据输入框中的数字确定。

for i in range(num):
    progress.setValue(i)
    if progress.wasCanceled():
        QMessageBox.warning(self,"提示","操作失败")
        break
else:
    progress.setValue(num)
    QMessageBox.information(self,"提示","操作成功")

setValue() 该属性保存当前进度。要使进度对话框按预期工作,您应该首先将此属性设置为 QProgressDialog 的最大值和最小值,您可以在两者之间调用 setValue() 任意次数。

使用 wasCanceled() 来判断我们是否按下了取消按钮,如果按下则提示失败。如果for循环成功结束,则执行else之后的语句,表示成功。

好了,今天的对话框介绍就暂时到这里了。

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论