Как я могу сделать обновление QProgressBar без обработки каких-либо других событий графического интерфейса? - PullRequest
0 голосов
/ 08 июня 2019

У меня есть графический интерфейс PySide, в котором несколько кнопок запускают длинную функцию обработки, которая впоследствии обновляет элементы графического интерфейса.Нажатие кнопки останавливает графический интерфейс на некоторое время, пока обработка не завершится.Поскольку это занимает некоторое время, я хотел добавить индикатор выполнения.Тем не менее, QProgressBar не показывает свои обновления прогресса, пока основной поток не находится в режиме ожидания, поэтому простой вызов progressBar.setValue () внутри цикла обработки не работает - progressBar просто будет сидеть в 0, а затем перейдет к 100%, когда обработкаКонец.

Я специально не хочу, чтобы весь графический интерфейс оставался отзывчивым - есть много элементов, которые влияют друг на друга, и, позволяя пользователю изменять что-либо во время выполнения обработки, может получить недопустимый результатгосударство.


Я пытался:

1) Использование QProgressBar.update ()

( Как гладко показать QProgressBar? ).

К сожалению, это показывает обновления progressBar только в течение первых 5 секунд, но затем появляется курсор «Ожидание», и индикатор progressBar прекращает обновление до завершения обработки.

2) Использование QtGui.QApplication.processEvents ()

( QProgressBar не показывает прогресс? )

Это показывает индикатор выполнения хорошо для полной продолжительности обработки, но сохраняет оставшуюся часть GUIотзывчивый - что в моем случае означает возможность ставить в очередь несколько экземпляров обработки, потенциально получая определенные элементы графического интерфейса «не синхронизировано».


Я еще не пробовал перемещать цикл обработки в отдельный поток(также рекомендуется по ссылке в # 2), так как я ожидаю, что это будет иметь тот же эффект, когда можно было бы получить графический интерфейс из Synq.


Грубое решение было быявно отключить все кнопки и текстовые правки, которые могут вывести графический интерфейс из синхронизации, а затем снова включитьобработка завершена.Но я надеюсь на чистое решение, которое я могу вызвать внутри цикла обработки - вместо QtGui.QApplication.processEvents () - которое будет обновлять только индикатор выполнения, а не весь графический интерфейс.

...