Python中QWidget控件在进度条窗口不显示的问题
解决Qt子窗口控件不显示且线程阻塞问题
问题根源
- 主线程阻塞:主GUI函数里的
time.sleep(3)会直接卡住Qt的事件循环,导致新创建的GuiProgressBar窗口无法完成控件绘制、事件分发,所以控件完全看不到,整个GUI也会失去响应。 - 线程停止逻辑不严谨:直接调用
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
相关产品推荐
相关产品推荐

