当前位置: 首页 > news >正文

【GUI】| PyQt5 QProgressBar

在 PyQt 中实现 .start()、.progress() 和 .finish() 功能,通常是为了在后台执行耗时任务的同时,通过信号(Signal)机制更新主线程中的进度条(如 QProgressBar),避免界面卡顿。

核心实现思路‌
‌.start()‌:调用 QThread.start() 启动工作线程。
‌.progress()‌:通过自定义信号(如 pyqtSignal(int))从工作线程向主线程发送进度更新。
‌.finish()‌:任务完成后发射完成信号(如 pyqtSignal(str)),通知主线程进行收尾操作。

from PyQt5.QtCore import QThread, QObject, pyqtSignal from PyQt5.QtWidgets import QApplication, QProgressBar, QPushButton, QVBoxLayout, QWidget import sys import time class Worker(QObject): progress = pyqtSignal(int) # 进度更新信号 finished = pyqtSignal(str) # 完成信号 def do_work(self): for i in range(101): time.sleep(0.1) # 模拟耗时操作 self.progress.emit(i) # 发送当前进度 self.finished.emit("任务完成!") class MainWindow(QWidget): def __init__(self): super().__init__() self.init_ui() def init_ui(self): self.progress_bar = QProgressBar(self) self.progress_bar.setRange(0, 100) self.start_button = QPushButton("开始任务", self) self.start_button.clicked.connect(self.start_task) layout = QVBoxLayout() layout.addWidget(self.progress_bar) layout.addWidget(self.start_button) self.setLayout(layout) # 线程和工作器初始化 self.thread = QThread() self.worker = Worker() self.worker.moveToThread(self.thread) # 连接信号与槽 self.thread.started.connect(self.worker.do_work) self.worker.progress.connect(self.progress_bar.setValue) self.worker.finished.connect(self.thread.quit) self.worker.finished.connect(self.worker.deleteLater) self.thread.finished.connect(self.thread.deleteLater) def start_task(self): if not self.thread.isRunning(): self.thread.start() if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec_())

使用 ‌Worker 对象 + moveToThread()‌ 方式,而非直接继承 QThread,更安全且符合 Qt 最佳实践

http://www.jsqmd.com/news/733323/

相关文章:

  • 告别手动查ID!用CAPL的GetMessageID/GetMessageName函数快速定位DBC报文(附实战代码)
  • 深入SX1278寄存器:手把手调试LoRa通信,解决“能发不能收”的典型问题
  • OpenAI Agents SDK 深度解析(三):执行层——Agent 的“幕后指挥部”
  • 如何在 MATLAB 中通过 Taotoken 调用 OpenAI 兼容的大模型 API
  • 从光电编码器到精准转速:DSP28335 eQEP模块的M/T法测速保姆级实现与误差分析
  • 别再手动画圈了!用EVenn在线工具5分钟搞定科研级维恩图(附Cell论文同款复现)
  • Windows 10/11 右键菜单找回失踪的CMD:一个注册表键值就能搞定
  • QMCDecode:解锁QQ音乐加密格式的桌面钥匙
  • 关于华夏百川中频激光治疗仪相关负面信息的澄清说明 - 野榜精选
  • 5分钟掌握TestDisk:开源数据恢复神器让丢失的分区和文件起死回生
  • 从飞秒到连续光:不同激光脉冲下,光学元件是怎么被“打坏”的?
  • FontForge实战:手把手教你制作一个支持简中、泰文、老挝文的“超级字体”文件(.ttf)
  • Windows事件查看器太慢?试试Event Log Explorer的5个高级筛选技巧
  • 保姆级教程:用PPOCRLabel给PaddleOCR制作数据集,从打标到训练集划分一步到位
  • 3分钟上手!用AKShare零成本玩转全球股票数据分析
  • 揭秘VADER Sentiment的3大核心技术突破:如何用规则引擎超越传统NLP模型
  • 系统防护的几种级别
  • 聚焦实操赋能,Captain AI系统功能实操指南及价值解读
  • 抖音评论采集神器:无需代码,3步获取完整评论数据的终极指南
  • Rent My Browser:AI租用真人浏览器实现网页自动化的开源项目
  • 别再只用plot了!Matlab双对数图loglog函数保姆级教程,从数据可视化到论文配图
  • LLM事实一致性评估:挑战、方法与工程实践
  • 教育机构搭建 AI 编程辅导平台时选择 Taotoken 的考量因素
  • CVE-2026-31431 (Copy Fail) 漏洞复现与验证记录
  • 6款UI设计工具技术横评(2026):从产品架构到协作能力等的工程化对比
  • 别光做仿真!用MATLAB App Designer给贪吃蛇做个图形界面(保姆级教程)
  • Display Driver Uninstaller (DDU):彻底解决显卡驱动问题的3步终极方案
  • 2026年选床垫弹簧机,这些老牌设备商更靠谱
  • Chrome文本替换插件实战指南:智能编辑网页内容的利器
  • MPC-BE:Windows平台开源媒体播放器的架构深度解析与技术实践