Вызывает ли QDialog :: exec в слоте основной цикл событий?

Главное окно моего приложения Qt является нормальным QMainWindow подкласс. В этом окне у меня есть несколько кнопок; у каждого своя clicked Сигнал подключен свой собственный слот, и каждый слот создает разные QDialog вот так:

void onButtonA_clicked()
{
MyADialog* dialog = new MyADialog(this);
dialog->exec();
delete dialog;
}

Я читал эту статью: https://wiki.qt.io/Threads_Events_QObjects#Events_and_the_event_loop и автор говорит

вы никогда не должны блокировать цикл обработки событий

что меня заинтересовало; exec является блокирующей функцией, поэтому в соответствии с тем, что он говорит там (его пример с Worker::doWork который выполняет большую работу и требует некоторого времени для завершения) мой код блокирует цикл обработки событий, но я не заметил ничего, что могло бы предложить это; напротив, основное окно, кажется, ведет себя нормально, и не было никакой разницы, когда я изменил код, чтобы использовать show() метод.

Я блокирую цикл событий? Должен ли я использовать другой подход здесь?

4

Решение

QDialog :: exec () блокирует основной цикл событий, да. Тем не менее, он не блокирует пользовательский интерфейс, так как он открывает локальный цикл событий внутри exec (), который обрабатывает события, пока диалог открыт. Это может быть источником неприятных ошибок: (почти) все может произойти до того, как exec () вернется, внешние события (таймеры, сеть, IPC и т. Д.) Могут вызвать слоты, вызвать появление других диалогов и т. Д. Только способы для пользователя непосредственное выполнение неожиданных вещей обычно ограничено, учитывая модальную природу большинства таких диалогов.

Нужно знать о возможной проблеме и не оставлять приложение в несовместимом состоянии при вызове exec (), и не полагаться на вещи такими, какими они были впоследствии.

В качестве альтернативы, позвоните неблокирующим QDialog :: Open () и подключиться к законченный() сигнал.

9

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

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector