Pyside2 (Qt For Python)进度条功能实现

Pyside2 (Qt For Python)进度条功能实现

进度条(QProgressBar)

今天来介绍PySide2进度条(QProgressBar)的使用,如下所示:
在这里插入图片描述

说明

进度条也是一个常用的控件,当程序需要做一件比较耗费时间的任务(比如统计数据,下载文件等)时,可以用来向用户指示操作的进度。而且有了进度显示,用户就知道应用程序仍在运行,并没有出问题。

QProgressBar进度条把每个进度称之为一个step(步骤)。

我们可以通过它的 setRange 方法设定步骤个数,比如

progressBar.setRange(0,10)

以上代码将进度分为5步。然后,通过 setValue 方法,指定当前完成到了哪一步,比如:

progressBar.setValue(7)

就表示完成了 7/10, 也就是 70%, 进度条就会显示70%的进度。

进度条程序示例代码
import time
from PySide2.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QPushButton, QProgressBar
from PySide2.QtCore import QThread, Signal

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

    def run(self):
        for i in range(101):
            time.sleep(0.1)  # 模拟耗时操作
            self.progress.emit(i)

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("进度条")
        self.setGeometry(100, 100, 300, 150)

        self.central_widget = QWidget(self)
        self.setCentralWidget(self.central_widget)

        self.layout = QVBoxLayout()
        self.central_widget.setLayout(self.layout)

        self.progress_bar = QProgressBar(self)
        self.layout.addWidget(self.progress_bar)

        self.button = QPushButton("开始", self)
        self.button.clicked.connect(self.start_process)
        self.layout.addWidget(self.button)

    def start_process(self):
        self.worker = Worker()
        self.worker.progress.connect(self.update_progress)
        self.worker.start()

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

if __name__ == "__main__":
    app = QApplication([])
    window = MainWindow()
    window.show()
    app.exec_()
  • 可以使用 setMinimum()setMaximum() 指定最小和最大 steps;默认值是0和99。

    • 当前的 step 由 **setValue()**设置
    • 进度条可以通过 reset() 方法,重新开始
  • 如果最小值和最大值都设置为0,也就是将setRange(0, 0),那么栏会显示一个繁忙的指示符,而不是步骤的百分比,如下所示:

    img

进度条进阶示例

通常,我们在使用进度条的时候,一般要同具体的任务进度绑定,常见的有两种情况:

  • 同数据进行绑定,例如操作的对象是大量的数据,可以将进度条的范围设置为总数据量,每运行相应的数据量,进度条随之更新

    • 以下是数据量和进度条进行绑定的代码示例
    total_rows = len(list(sheet1.iter_rows()))  # 获取总行数
    current_row = 0 # 设置当前运行行数
    
    current_row += 1 # 每运行一行,变量自动+1
    progress = int(current_row / total_rows * 100)
    compareWin.update_progress_bar(100)  # 更新进度条
    
  • 同线程进行绑定,如果当前的项目存在多线程运行的情况,可以将进度条和线程进行绑定,方便实时反映程序运行情况,以下是线程和进度条绑定的代码示例

    import sys
    from PySide2.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QProgressBar
    from PySide2.QtCore import QThread, Signal
    
    class WorkerThread(QThread):
      # 定义一个信号,用于更新进度条
      update_progress = Signal(int)
    
      def run(self):
        for i in range(101):
          # 发送信号,更新进度条
          self.update_progress.emit(i)
          self.msleep(50)  # 模拟耗时操作
    
    class MainWindow(QWidget):
      def __init__(self):
        super().__init__()
    
        self.initUI()
    
      def initUI(self):
        self.setWindowTitle('进度条和线程绑定示例')
        self.setGeometry(100, 100, 400, 200)
    
        # 创建垂直布局
        layout = QVBoxLayout(self)
    
        # 创建进度条
        self.progress_bar = QProgressBar(self)
        layout.addWidget(self.progress_bar)
    
        # 创建按钮,点击按钮启动线程
        self.start_button = QPushButton('开始', self)
        self.start_button.clicked.connect(self.startThread)
        layout.addWidget(self.start_button)
    
        self.setLayout(layout)
    
      def startThread(self):
        # 创建线程实例
        self.thread = WorkerThread()
    
        # 将线程的信号连接到更新进度条的槽函数
        self.thread.update_progress.connect(self.updateProgressBar)
    
        # 启动线程
        self.thread.start()
    
        # 禁用按钮,防止多次点击
        self.start_button.setEnabled(False)
    
      def updateProgressBar(self, value):
        # 更新进度条的值
        self.progress_bar.setValue(value)
    
        # 如果进度达到100%,启用按钮
        if value == 100:
          self.start_button.setEnabled(True)
    
    if __name__ == "__main__":
      app = QApplication(sys.argv)
      window = MainWindow()
      window.show()
      sys.exit(app.exec_())
    
    
  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是使用 PySide6 实现环形进度条的示例代码: ```python import sys from PySide6.QtCore import Qt, QTimer from PySide6.QtGui import QPainter, QColor, QPen from PySide6.QtWidgets import QApplication, QWidget class CircularProgressBar(QWidget): def __init__(self): super().__init__() self._progress = 0 self._timer = QTimer(self) self._timer.timeout.connect(self.updateProgress) self._timer.start(50) self.setWindowTitle("Circular Progress Bar") self.setFixedSize(200, 200) self.show() def updateProgress(self): self._progress += 1 if self._progress > 100: self._progress = 0 self.update() def paintEvent(self, event): painter = QPainter(self) painter.setRenderHint(QPainter.Antialiasing) pen = QPen() pen.setWidth(10) pen.setColor(QColor("#1E90FF")) painter.setPen(pen) painter.drawArc(20, 20, 160, 160, 0, self._progress * 3.6 * 16) if __name__ == "__main__": app = QApplication(sys.argv) progress_bar = CircularProgressBar() sys.exit(app.exec()) ``` 在上面的代码中,CircularProgressBar 类继承自 QWidget 类,它包含了一个 QTimer 对象,用于定时更新进度条的值,并实现了 updateProgress() 和 paintEvent() 方法。 updateProgress() 方法简单地增加进度条的值,并在值达到 100 后将其重置为 0。 paintEvent() 方法绘制了一个圆弧,表示当前进度。圆弧的起始角度为 0,结束角度为当前进度乘以 3.6(即一度的角度)乘以 16(表示 1/16 的精度)。 运行上面的代码,将会看到一个环形的进度条,每隔 50 毫秒更新一次进度。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值