You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用PySide2的QPropertyAnimation实现QProgressBar数值顺滑更新

QProgressBar 顺滑更新效果实现方案

你当前的代码每次进度步长为5、更新间隔100ms,进度条是跳变更新,没有过渡动画,所以视觉上不够顺滑。下面是最常用的两种实现方案:

方案1:使用QPropertyAnimation属性动画(推荐)

利用Qt原生的属性动画系统对进度条的value属性做插值过渡,每次收到新的目标进度值时,会自动在指定时长内平滑过渡到目标值,不需要修改原有工作线程的逻辑,改动成本极低,且支持自定义缓动曲线。

修改后的完整代码如下:

import time
from PySide2.QtWidgets import QProgressBar, QApplication
from PySide2.QtCore import Slot, QThread, Signal, QPropertyAnimation, QEasingCurve

class ProgressBarUpdater(QThread):
    progressBarValue = Signal(int)

    def run(self):
        value: int = 0
        while value <= 100:
            time.sleep(0.1)
            self.progressBarValue.emit(value)
            value += 5


def main():
    app = QApplication([])
    pbar = QProgressBar()
    pbar.setMinimum(0)
    pbar.setMaximum(100)
    pbar.show()

    # 初始化进度条值的属性动画
    progress_anim = QPropertyAnimation(pbar, b"value")
    progress_anim.setDuration(150)  # 过渡动画时长,单位毫秒,可自行调整
    progress_anim.setEasingCurve(QEasingCurve.InOutQuad)  # 缓动曲线,让过渡更自然

    @Slot(int)
    def progressbar_update(value: int):
        # 收到新进度值时,启动动画过渡到目标值
        progress_anim.setEndValue(value)
        progress_anim.start()

    progressBarUpdater = ProgressBarUpdater()
    progressBarUpdater.progressBarValue.connect(progressbar_update)
    progressBarUpdater.start()

    app.exec_()

if __name__ == "__main__":
    main()

你可以调整setDuration的参数修改动画速度,也可以更换QEasingCurve的类型实现不同的过渡效果,比如线性过渡用QEasingCurve.Linear。

方案2:缩小更新步长+缩短间隔

如果不想引入动画,也可以直接修改工作线程的更新逻辑,把步长缩小、更新频率拉高,也能提升顺滑度:

  • 把步长从5改为1
  • 把time.sleep(0.1)改为time.sleep(0.02)
    这种方案不需要额外引入动画类,但没有缓动效果,高频率的信号发送也会占用更多UI线程资源,仅适合简单场景使用。

内容的提问来源于stack exchange,提问作者Rizwan Hasan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 12:27:01