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

Python中QWidget控件在进度条窗口不显示的问题

解决Qt子窗口控件不显示且线程阻塞问题

问题根源

  1. 主线程阻塞:主GUI函数里的time.sleep(3)会直接卡住Qt的事件循环,导致新创建的GuiProgressBar窗口无法完成控件绘制、事件分发,所以控件完全看不到,整个GUI也会失去响应。
  2. 线程停止逻辑不严谨:直接调用exit()强制终止线程,未等待线程正常结束就隐藏窗口,可能引发线程资源泄漏。

修复方案

  • 用Qt自带的QTimer替代time.sleep(),通过定时器延迟执行后续操作,保证主线程事件循环正常运转。
  • 优化线程停止逻辑,等待线程完全退出后再处理窗口隐藏。
  • 调整进度条数值映射,让倒计时计数和进度条范围匹配。

修改后的代码示例

主GUI类的窗口调用逻辑

from PyQt5.QtCore import QTimer

def TestOpenProgressWindow(self):
    # 将窗口实例设为类属性,避免被垃圾回收机制提前销毁
    self.myProgressBar = TimerThread.GuiProgressBar()
    self.myProgressBar.show()
    # 3秒后触发关闭逻辑
    QTimer.singleShot(3000, self._delayedCloseProgress)

def _delayedCloseProgress(self):
    self.myProgressBar.StopProgressBar()
    # 等待线程完全结束后再隐藏窗口
    self.myProgressBar.barThread.wait()
    self.myProgressBar.hide()

WorkerThread类的停止方法优化

def stopThread(self):
    self.runs = False
    self.count = -1
    self.wait()  # 等待线程正常退出,替代强制exit()

GuiProgressBar的进度条更新逻辑调整

def UpdateProgressBar(self, value):
    # 将0-9的计数转换成0-100的百分比,匹配进度条最大值
    self.hprogress1.setValue(value * 10)

额外说明

如果不需要窗口创建后自动启动线程,可以移除GuiProgressBar.__init__中的self.StartProgressBar()调用,由外部代码控制线程启动时机。

内容的提问来源于stack exchange,提问作者Carl Rostron

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 16:42:45