Я написал функцию для расчета некоторых значений и использовал append
записать их в textBrowser
каждый раз, когда значение было рассчитано.
Я хочу, чтобы каждый раз append
выполняется, данные отображаются в textBrowser
одновременно.
Тем не менее, все данные отображаются сразу после завершения функции. Не один за другим.
Также у меня есть кнопка. Я хочу, чтобы он изменил свой текст при нажатии и изменил снова, когда его функция будет выполнена. Итак, я написал:
void MainWindow::on_btn_clicked(){
ui->btn->setText("Running...");
//some codes
ui->btn->setText("Reset");
}
Но это только изменяет текст кнопки на «Сброс», когда clicked
функция окончена
Я думаю, что эти две проблемы могут быть актуальны, но я не могу найти решение.
Вы должны понимать, что происходит в вашей программе.
Прежде всего, Взгляни на Основы потоков. После этого вы можете выбрать подход, который вы хотите от Многопоточные технологии в Qt.
В двух словах, ваша проблема заключается в том, что вы выполняете некоторые блокирующие долгосрочные вычисления в своем основном потоке. Чтобы избежать этого, вы должны предоставить все расчеты в отдельном потоке. Вот достаточный ответ на ваш вопрос: https://stackoverflow.com/a/1386160/867349.
Самый простой, но не очень хороший способ QCoreApplication::processEvents()
например внутри вашего //some codes
цикл. Надеюсь, вы найдете лучший способ, как QtCuncurrentRun
или готовим рабочий поток по ссылкам выше.
GUI не обновляется до тех пор, пока элемент управления не вернется в цикл событий. Поэтому при добавлении в текстовый браузер все они обновляются после выполнения основного цикла событий. Это также верно для установки текста кнопки. когда on_btn_clicked()
вызывается, текст кнопки не обновляется до завершения функции.
Если у вас есть какие-то коды, которые требуют длительного времени для обработки, вам не следует помещать их в основной поток. Это должно быть сделано в другом потоке, который взаимодействует с основным потоком через сигналы и слоты, чтобы сообщить о некотором прогрессе или обновить элементы GUI.