Подтвердить что ты не робот

Принуждение 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 обновляется до того, как он войдет в эту функцию?
Спасибо.

4b9b3361

Ответ 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.