如何在不处理任何其他GUI事件的情况下进行QProgressBar更新?

时间:2019-06-07 21:39:15

标签: python pyside qprogressbar

我有一个PySide GUI,其中几个按钮触发了一个长处理功能,该功能随后会更新GUI元素。按下按钮会使GUI冻结一段时间,直到处理完成。由于需要一段时间,因此我想添加一个进度条。但是,在主线程空闲之前,QProgressBar不会显示其进度更新,因此仅在处理循环内调用progressBar.setValue()不起作用-progressBar只会位于0,然后在处理时跳至100%完成。

我特别不希望整个GUI保持响应状态-有很多相互影响的元素,允许用户在处理运行时进行任何更改都可能使状态变为无效。


我尝试过:

1)使用QProgressBar.update()

How to show QProgressBar smoothly?)。

不幸的是,这仅显示了ProgressBar的更新,仅持续了大约5秒钟,但是随后出现了“等待”光标,并且progressBar停止更新,直到处理完成。

2)使用QtGui.QApplication.processEvents()

QProgressBar not showing progress?

这很好地显示了整个处理期间的进度条,但是它使GUI的其余部分保持了响应-在我的情况下,这意味着能够对多个处理实例进行排队,从而可能使某些GUI元素“不同步”


我还没有尝试将处理循环移到一个单独的线程中(也由#2中的链接推荐),因为我希望在将GUI移出synq的情况下具有相同的效果。 / p>


强力解决方案将是显式禁用所有可能使GUI脱离synq的按钮和文本编辑,然后在处理完成后重新启用。但是我希望有一个干净的解决方案,我可以在处理循环中调用它-而不是QtGui.QApplication.processEvents()-它将仅更新进度条,而不是整个GUI。

0 个答案:

没有答案