Дело не в том, что есть отставание. Чтобы вы это хорошо поняли, используйте следующую метафору: допустим, есть 2 человека, оба должны продвинуться на 1 м за 1 секунду, но первый выполняет только прыжки каждую секунду, а второй выполняет несколько непрерывных шагов, поэтому первый человек подобен на прогрессбаре без текста и во втором с текстом.
При изменении значения прогрессбара оценивается, нужно ли его перекрашивать, и в случае, если есть видимый текст, это делается в любом случае, хотя не нужно, если значение изменилось, с другой стороны если нет текста, кроме измененного значения, требуется, чтобы шаг был соответствующим, я думаю, что из соображений производительности.
Эту часть кода можно найти в следующем ссылка
Решение состоит в том, чтобы принудительно рисовать каждый раз, когда происходит изменение.
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_())
person
eyllanesc
schedule
25.07.2018