Вызывает ли 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, и автор говорит
вы никогда не должны блокировать цикл обработки событий
что меня заинтересовало; exec
является блокирующей функцией, поэтому в соответствии с тем, что он говорит там (его пример с Worker::doWork
который выполняет большую работу и требует некоторого времени для завершения) мой код блокирует цикл обработки событий, но я не заметил ничего, что могло бы предложить это; напротив, основное окно, кажется, ведет себя нормально, и не было никакой разницы, когда я изменил код, чтобы использовать show()
метод.
Я блокирую цикл событий? Должен ли я использовать другой подход здесь?
1 ответ
QDialog::exec() блокирует основной цикл событий, да. Тем не менее, он не блокирует пользовательский интерфейс, так как он открывает локальный цикл событий внутри exec(), который обрабатывает события, пока диалог открыт. Это может быть источником неприятных ошибок: (почти) все может произойти до того, как exec () вернется, внешние события (таймеры, сеть, IPC и т. Д.) Могут вызвать слоты, вызвать появление других диалогов и т. Д. Только способы для пользователя непосредственное выполнение неожиданных вещей обычно ограничено, учитывая модальную природу большинства таких диалогов.
Нужно знать о возможной проблеме и не оставлять приложение в несовместимом состоянии при вызове exec(), и не полагаться на вещи такими, какими они были впоследствии.
В качестве альтернативы, вызовите неблокирующую функцию QDialog::open() и подключитесь к сигналу finish ().