PySide6————实现多个按钮控制一个进度条QProgressBar

实现三个按钮控制一个进度条分别显示不同的进度

import time

from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QProgressBar, QVBoxLayout, QWidget
from PySide6.QtCore import Qt, QThread, Signal


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("Progress Bar Example")

        # 创建一个QWidget实例
        central_widget = QWidget()
        layout = QVBoxLayout(central_widget)

        self.button1 = QPushButton("Start Progress 50", self)
        # 任务一的进度条最大值为 50
        self.button1.clicked.connect(lambda: self.start_progress(50))

        self.button2 = QPushButton("Start Progress 30", self)
        # 任务一的进度条最大值为 30
        self.button2.clicked.connect(lambda: self.start_progress(30))

        self.button3 = QPushButton("Start Progress 44", self)
        # 任务一的进度条最大值为 44
        self.button3.clicked.connect(lambda: self.start_progress(44))

        self.progress = QProgressBar(self)
        self.progress.setAlignment(Qt.AlignHCenter)
        self.progress.hide()  # 初始时设置进度条为隐藏状态

        layout.addWidget(self.button1)
        layout.addWidget(self.button2)
        layout.addWidget(self.button3)
        layout.addWidget(self.progress)

        # 将QWidget实例设置为centralWidget
        central_widget.setLayout(layout)
        self.setCentralWidget(central_widget)

    def start_progress(self, max_value):
        self.progress.setValue(0)
        self.progress.setMaximum(max_value)  # 设置进度条的最大值
        self.progress.show()  # 当按钮被点击时,显示进度条
        for i in range(max_value):
            self.progress.setValue(i+1)
            time.sleep(0.005)

        self.progress.hide()



    def update_progress(self, value):
        self.progress.setValue(value)

    def hide_progress(self):
        self.progress.hide()  # 隐藏进度条

app = QApplication([])
window = MainWindow()
window.show()

app.exec()

上面的代码,有一个缺陷,如果大量复杂工作在按钮的点击事件槽函数中执行的话,那么有可能造成程序界面响应失效。针对这个问题,可以通过自定义信号和槽来解决,以下是具体的实现:

from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QProgressBar, QVBoxLayout, QWidget
from PySide6.QtCore import Qt, QThread, Signal

class Worker(QThread):
    progress = Signal(int)

    def __init__(self):
        super().__init__()
        self.max_value = 100

    def set_max_value(self, max_value):
        self.max_value = max_value

    def run(self):
        for i in range(self.max_value + 1):
            self.progress.emit(i)
            self.msleep(10)

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("Progress Bar Example")

        # 创建一个QWidget实例
        central_widget = QWidget()
        layout = QVBoxLayout(central_widget)

        self.button1 = QPushButton("Start Progress 50", self)
        self.button1.clicked.connect(lambda: self.start_progress(50))

        self.button2 = QPushButton("Start Progress 30", self)
        self.button2.clicked.connect(lambda: self.start_progress(30))

        self.button3 = QPushButton("Start Progress 44", self)
        self.button3.clicked.connect(lambda: self.start_progress(44))

        self.progress = QProgressBar(self)
        self.progress.setAlignment(Qt.AlignHCenter)
        self.progress.hide()  # 初始时设置进度条为隐藏状态

        layout.addWidget(self.button1)
        layout.addWidget(self.button2)
        layout.addWidget(self.button3)
        layout.addWidget(self.progress)

        # 将QWidget实例设置为centralWidget
        central_widget.setLayout(layout)
        self.setCentralWidget(central_widget)

    def start_progress(self, max_value):
        self.progress.setMaximum(max_value)  # 设置进度条的最大值
        self.progress.show()  # 当按钮被点击时,显示进度条
        self.worker = Worker()
        self.worker.set_max_value(max_value)  # 设置最大值
        self.worker.progress.connect(self.update_progress)
        self.worker.finished.connect(self.hide_progress)  # 当进度完成时,隐藏进度条
        self.worker.start()

    def update_progress(self, value):
        self.progress.setValue(value)

    def hide_progress(self):
        self.progress.hide()  # 隐藏进度条

app = QApplication([])
window = MainWindow()
window.show()
app.exec()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值