如何使用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
相关产品推荐
相关产品推荐

