前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PySide6 GUI 编程(28):QProgressDialog进度条

PySide6 GUI 编程(28):QProgressDialog进度条

原创
作者头像
bowenerchen
发布2024-08-21 10:25:21
1212
发布2024-08-21 10:25:21
举报
文章被收录于专栏:编码视界

示例代码

代码语言:python
代码运行次数:0
复制
from __future__ import annotations

import sys

from PySide6.QtCore import Qt, QTimer
from PySide6.QtWidgets import QApplication, QMainWindow, QProgressDialog, QPushButton, QVBoxLayout, QWidget


class MyMainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.progress = None
        self.setWindowTitle("QProgressDialog Demo")

        self.minimum_value = 0
        self.maximum_value = 100
        self.current_value = 0

        self.timer = QTimer(self)
        self.timer.timeout.connect(self.progress_dialog_update)
        self.timer.setTimerType(Qt.TimerType.PreciseTimer)
        self.timer.setInterval(20)  # 每20毫秒触发一次

        self.begin_button = QPushButton("开始运行")
        self.begin_button.clicked.connect(self.progress_dialog_show)

        v_layout = QVBoxLayout()
        v_layout.addWidget(self.begin_button)

        container = QWidget()
        container.setLayout(v_layout)

        self.setCentralWidget(container)

    def progress_dialog_show(self):
        self.progress = QProgressDialog(self)
        self.progress.setWindowTitle("请稍候")
        self.progress.setLabelText("正在处理...")
        self.progress.setMinimum(self.minimum_value)
        self.progress.setMaximum(self.maximum_value)
        self.progress.setValue(self.minimum_value)
        self.progress.setModal(True)
        self.progress.setCancelButtonText("取消执行")
        # self.progress.setCancelButton(None) # 隐藏按钮, 不展示此按钮
        self.progress.canceled.connect(self.progress_canceled)
        self.progress.show()
        self.timer.start()

    def progress_canceled(self):
        print('用户取消了进度对话框, 当前已完成进展:{:.2f}%'.format(self.current_value / self.maximum_value * 100))
        self.progress.setValue(self.maximum_value)
        self.timer.stop()
        self.progress.accept()
        self.current_value = self.minimum_value

    def progress_dialog_update(self):
        if self.progress.value() + 1 > self.current_value:
            self.current_value = self.progress.value() + 1
        # 当进度值等于最大值时,QProgressDialog会将进度值重置为-1
        # 因此无法直接判断progress.value() >= self.maximum_value
        # 需要判断progress.value() < self.minimum_value或progress.value() >= self.progress.maximum() - 1
        if self.progress.value() < self.minimum_value or self.progress.value() >= self.progress.maximum() - 1:
            self.current_value = self.minimum_value
            self.progress.setValue(self.maximum_value)
            self.timer.stop()
            self.progress.accept()
            print('进度对话框已完成')
            return
        self.progress.setValue(self.progress.value() + 1)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MyMainWindow()
    window.show()
    sys.exit(app.exec())

运行效果

进度条运行效果
进度条运行效果

特别注意

当进度值累加到最大值或超过最大值时,QProgressDialog会将进度值重置为-1

代码语言:python
代码运行次数:0
复制
if __name__ == "__main__":
    app = QApplication(sys.argv)

    # 测试QProgressDialog在最大值时,会将进度值重置为-1
    test_progress_dialog = QProgressDialog()
    test_progress_dialog.setMinimum(0)
    test_progress_dialog.setMaximum(10)
    # 当进度值等于最大值时,QProgressDialog会将进度值重置为-1
    # 在进度值达到最大值时自动完成并关闭
    test_progress_dialog.setValue(10)
    print(test_progress_dialog.value())

    sys.exit(app.exec())

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 示例代码
  • 运行效果
  • 特别注意
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档