У меня есть графический интерфейс 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 () - которое будет обновлять только индикатор выполнения, а не весь графический интерфейс.