Принуждение Qt GUI к обновлению перед вводом отдельной функции
Кажется, это должно быть автоматическим, но, видимо, это не так. У меня есть следующий код:
ui.my_label->setText("Test 1...");
ui.my_label->adjustSize();
processThatTakesAbout30SecondsToFinish(files[0].toStdString());
ui.my_label->setText("Finished.");
ui.my_label->adjustSize();
Что происходит, так это то, что я никогда не вижу "Test1...",
, поскольку графический интерфейс, кажется, виснет до тех пор, пока не завершится выполнение следующей функции, и я eventaully только вижу "Закончено".
Как я могу убедиться, что GUI обновляется до того, как он войдет в эту функцию?
Спасибо.
Ответы
Ответ 1
Вы должны обработать очередь событий перед вводом кода, если вы:
#include <QApplication>
и если вы хотите обновить свой графический интерфейс, вызовите
qApp->processEvents();
Обратите внимание, что это может быть хорошей идеей, чтобы ваш длительный процесс вызова вызывал эту функцию время от времени, чтобы ваш графический интерфейс чувствовал себя более отзывчивым.
Ответ 2
Если вы не заботитесь о том, чтобы ваш графический интерфейс был отзывчивым в течение этого времени, тогда вызов my_label->repaint()
сделал бы трюк. Qt не может сделать ничего автоматически для вас, если вы не уступите циклу событий.
Для максимальной реакции вы можете рассмотреть возможность запуска своего процесса в отдельном потоке и использовать соединения по сигналу/слоту (которые по умолчанию являются потокобезопасными), чтобы сигнализировать о вашем главном потоке графического интерфейса при завершении обработки.
Ответ 3
Я просто хотел добавить, что для меня это взяло комбо из двух ответов, которые я видел здесь. Так что сработало для меня:
ui.my_label->setText("Test 1...");
ui.my_label->adjustSize();
//! Both of these lines needed
ui.my_label->repaint();
qApp->processEvents();
processThatTakesAbout30SecondsToFinish(files[0].toStdString());
ui.my_label->setText("Finished.");
ui.my_label->adjustSize();
Надеюсь, это поможет кому-то.
Ответ 4
Определение функции...
void YourClass::Update_Ui()
{
if(this->isEnabled())
return;
this->repaint();
qApp->processEvents();
}
... вот так и убедитесь, что this
отключено (для предотвращения действий пользователя), в то время как вы хотите, чтобы принудительное обновление пользовательского ui
было лучшим решением для меня.
Пример того, как использовать его внутри функции (например, во время обработки стека, которая занимает много времени):
this->setEnabled(false);
//Do whatever you want
Update_Ui();
//Do some other stuff
this->setEnabled(true);
Это не позволяет пользователю нарушать обработку пользовательским ui
(она отключена) и обновляется всякий раз, когда Update_Ui();
вызывается в коде и обновляет весь пользовательский ui
, а не только выбранный ярлык или что-то еще. Обратите внимание, что это не блокирует сигналы, ui
элементами пользовательского ui
.