Я разрабатываю графический интерфейс в QT, который выполняет тяжелые вычисления на основе пользовательского ввода. Я делаю все вычисления в функции сказать start_computation () , так как вызывается функция start_computation (), мой GUI зависает, так как он занят выполнением функции start_computation (). Итак, я хочу использовать QProgressBar, чтобы пользователь знал, что GUI выполняет некоторую задачу в фоновом режиме.
что будет лучшим способом реализовать QProgressBar в таком случае?
Если все сложные вычисления обрабатываются одной функцией, их можно легко перенести на QtConcurrent Framework, делая что-то вроде следующего, как упомянуто в учебнике, связанном ниже:
QFuture<void> future = QtConcurrent::run(&this->MyObject, &MyClass::LongFunction);
FutureWatcher
Затем объект обновит индикатор выполнения в соответствии с информацией о будущем завершении.
Есть полный пример того, как использовать QProgressBar с QFutures и QtConcurrent в общем тут: https://wiki.qt.io/Progress_Bar
Добавление информации о частичном завершении в индикатор выполнения будет тривиальным, и выдается соответствующая информация с использованием signals/slot
механизм.
Я не знаю о вашем точном сценарии, но если ваше вычисление является одной функцией ( start_computation()
), ты можешь использовать нить а также QThread
это хорошее решение.
На самом деле вам нужно поместить свои тяжелые вычисления в новый поток. Затем вы можете время от времени проверять прогресс вычислений из основного потока (GUI) и обновлять свой индикатор выполнения.
PS: Чтобы увидеть пример реализации QThread
правильно, вы можете обратиться к этот ТАК вопрос а также Вот.
Лучший способ сделать это — переместить start_computation()
функционировать в свой собственный поток, а затем с помощью signal/slot
Механизм обновления графического интерфейса корректно. Графический интерфейс должен всегда выполняться в главном потоке, и интенсивная функция всегда блокирует это.
Есть хорошая дискуссия о том, как использовать QThreads
правильно здесь: http://blog.debao.me/2013/08/how-to-use-qthread-in-the-right-way-part-1/