Как реализовать QProgressBar для тяжелых вычислений?

Я разрабатываю графический интерфейс в QT, который выполняет тяжелые вычисления на основе пользовательского ввода. Я делаю все вычисления в функции сказать start_computation () , так как вызывается функция start_computation (), мой GUI зависает, так как он занят выполнением функции start_computation (). Итак, я хочу использовать QProgressBar, чтобы пользователь знал, что GUI выполняет некоторую задачу в фоновом режиме.

что будет лучшим способом реализовать QProgressBar в таком случае?

1

Решение

Если все сложные вычисления обрабатываются одной функцией, их можно легко перенести на QtConcurrent Framework, делая что-то вроде следующего, как упомянуто в учебнике, связанном ниже:

 QFuture<void> future = QtConcurrent::run(&this->MyObject, &MyClass::LongFunction);

FutureWatcher Затем объект обновит индикатор выполнения в соответствии с информацией о будущем завершении.

Есть полный пример того, как использовать QProgressBar с QFutures и QtConcurrent в общем тут: https://wiki.qt.io/Progress_Bar

Добавление информации о частичном завершении в индикатор выполнения будет тривиальным, и выдается соответствующая информация с использованием signals/slot механизм.

8

Другие решения

Я не знаю о вашем точном сценарии, но если ваше вычисление является одной функцией ( start_computation()), ты можешь использовать нить а также QThread это хорошее решение.

На самом деле вам нужно поместить свои тяжелые вычисления в новый поток. Затем вы можете время от времени проверять прогресс вычислений из основного потока (GUI) и обновлять свой индикатор выполнения.

PS: Чтобы увидеть пример реализации QThread правильно, вы можете обратиться к этот ТАК вопрос а также Вот.

0

Лучший способ сделать это — переместить start_computation() функционировать в свой собственный поток, а затем с помощью signal/slot Механизм обновления графического интерфейса корректно. Графический интерфейс должен всегда выполняться в главном потоке, и интенсивная функция всегда блокирует это.

Есть хорошая дискуссия о том, как использовать QThreads правильно здесь: http://blog.debao.me/2013/08/how-to-use-qthread-in-the-right-way-part-1/

0
По вопросам рекламы [email protected]