我有一个每秒更新的QProgressBar。它不需要百分比文本,所以我在创建时添加了progressBar.setTextVisible(False)。然而,这使得它的响应非常慢和滞后,因此它需要超过一秒钟的时间来更新。此外,其他代码将等待进度条更新以执行,从而使整个程序变慢。这既发生在进度条不显示文本的macOS上,也发生在像Ubuntu这样显示文本的OSes上。
为什么使进度文本不可见会导致这种情况,我如何解决这个问题(同时仍然删除进度文本)?
发布于 2018-07-25 10:40:41
这并不是说有滞后。为了更好地理解它,可以使用下面的比喻:假设有两个人,两个人都必须在1秒内前进1米,但第一个人每秒只执行跳转,而第二个人执行几个连续的步骤,所以第一个人在没有文本的进度条上是相似的,第二个人是有文本的。
当进度条的值改变时,如果有必要重新绘制它,它会被评估,如果有可见的文本,无论如何都会完成,尽管它不需要值是否已经改变,另一方面,如果除了改变的值之外没有其他文本,则要求该步骤是适当的,我认为出于性能原因。
这部分代码可以在下面的link中找到
解决方案是在每次发生更改时强制绘制。
progressBar.valueChanged.connect(progressBar.repaint)示例:
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
def create_progressBar(timeLine, isTextVisible, workaround=False):
progressBar = QtWidgets.QProgressBar()
progressBar.setTextVisible(isTextVisible)
timeLine.frameChanged.connect(progressBar.setValue)
if workaround:
progressBar.valueChanged.connect(progressBar.repaint)
progressBar.setRange(0, 100)
return progressBar
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
widget = QtWidgets.QWidget()
lay = QtWidgets.QFormLayout(widget)
timeLine = QtCore.QTimeLine(1000*10)
timeLine.setFrameRange(0, 100)
normal_with_text = create_progressBar(timeLine, True)
normal_without_text = create_progressBar(timeLine, False)
workaround_without_text = create_progressBar(timeLine, False, True)
lay.addRow("normal_with_text", normal_with_text)
lay.addRow("normal_without_text", normal_without_text)
lay.addRow("workaround_without_text", workaround_without_text)
timeLine.start()
widget.show()
sys.exit(app.exec_())https://stackoverflow.com/questions/51509798
复制相似问题