Текстовый браузер Qt не отображается в реальном времени

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

Я хочу, чтобы каждый раз append выполняется, данные отображаются в textBrowser одновременно.

Тем не менее, все данные отображаются сразу после завершения функции. Не один за другим.

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

void MainWindow::on_btn_clicked(){
ui->btn->setText("Running...");
//some codes
ui->btn->setText("Reset");
}

Но это только изменяет текст кнопки на «Сброс», когда clicked функция окончена

Я думаю, что эти две проблемы могут быть актуальны, но я не могу найти решение.

1

Решение

Вы должны понимать, что происходит в вашей программе.

Прежде всего, Взгляни на Основы потоков. После этого вы можете выбрать подход, который вы хотите от Многопоточные технологии в Qt.

В двух словах, ваша проблема заключается в том, что вы выполняете некоторые блокирующие долгосрочные вычисления в своем основном потоке. Чтобы избежать этого, вы должны предоставить все расчеты в отдельном потоке. Вот достаточный ответ на ваш вопрос: https://stackoverflow.com/a/1386160/867349.

Самый простой, но не очень хороший способ QCoreApplication::processEvents() например внутри вашего //some codesцикл. Надеюсь, вы найдете лучший способ, как QtCuncurrentRun или готовим рабочий поток по ссылкам выше.

1

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

GUI не обновляется до тех пор, пока элемент управления не вернется в цикл событий. Поэтому при добавлении в текстовый браузер все они обновляются после выполнения основного цикла событий. Это также верно для установки текста кнопки. когда on_btn_clicked() вызывается, текст кнопки не обновляется до завершения функции.

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

3

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