QtWidgets.QProgressBar.setTextVisible(False) вызывает отставание

У меня есть QProgressBar, который обновляется каждую секунду. Процентный текст на нем не нужен, поэтому я добавил progressBar.setTextVisible(False) при его создании. Однако это сделало его чрезвычайно медленным и медленным, так что обновление заняло больше секунды. Кроме того, другой код будет ждать обновления индикатора выполнения для выполнения, что замедляет работу всей программы. Это происходит как в macOS, где индикаторы выполнения все равно не отображают текст, так и в других ОС, таких как Ubuntu, которые его показывают.

Почему это приводит к тому, что текст прогресса не отображается, и как я могу решить эту проблему (при этом удаляя текст прогресса)?


person noname    schedule 25.07.2018    source источник


Ответы (1)


Дело не в том, что есть отставание. Чтобы вы это хорошо поняли, используйте следующую метафору: допустим, есть 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