c – 在插槽中调用QDialog :: exec会阻塞主事件循环吗?

我的Qt应用程序的主窗口是一个普通的QMainWindow子类.在那个窗口我有几个按钮;每个插槽都有自己的插槽,每个插槽创建一个不同的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和作者说

you should never ever block the event loop

哪个让我担心; exec是一个阻塞函数,所以根据他说的那些(他的例子有Worker :: doWork做了很多工作,需要一些时间来完成)我的代码阻止了事件循环,但我没有注意到任何会建议这个;相反,主窗口似乎表现正常,并且当我更改代码以使用show()方法时没有区别.

我阻止了事件循环吗?我应该在这里使用不同的方法吗?

最佳答案
QDialog :: exec()阻止主事件循环,是的.它不会阻止UI,因为它在exec()内部打开一个本地事件循环,它在对话框打开时处理事件.这可能是令人讨厌的错误的来源:(几乎)任何事情都可能发生在exec()返回之前,外部事件(定时器,网络,IPC,等等)可以调用插槽,导致其他对话框出现等等.只是用户的方式考虑到大多数此类对话的模态性质,直接做意想不到的事情通常是有限的.

一个人需要知道可能的问题,并且在调用exec()时不要让应用程序处于不一致的状态,而不是依赖于之后的事情.

或者,调用非阻塞QDialog::open()并连接到finished()信号.

转载注明原文:c – 在插槽中调用QDialog :: exec会阻塞主事件循环吗? - 代码日志