在插槽中调用QDialog::exec是否会阻塞主事件循环
Does calling QDialog::exec in a slot block the main event loop?
我的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()
方法时没有什么不同。
我是否阻止了事件循环?我应该使用不同的方法吗?
QDialog::exec()
阻止主事件循环,是的。不过,它并没有阻塞UI,因为它在exec()
内部打开了一个本地事件循环,该循环在对话框打开时处理事件。这可能是严重错误的来源:(几乎)在exec()
返回之前,任何事情都可能发生,外部事件(定时器、网络、IPC等)可能会调用插槽,导致其他对话框出现,等等。考虑到大多数此类对话框的模态性质,用户直接做意外事情的方式通常是有限的。
需要意识到可能的问题,在调用exec()
时不要让应用程序处于不一致的状态,也不要依赖于之后的情况。
或者,调用非阻塞QDialog::open()
并连接到finished()
信号。
相关文章:
- 具有Qt事件循环的可移植通用共享库设置
- 如何将事件循环中的事件分派给订阅者?
- C++uWebSockets将事件循环集成到一个线程中
- 了解如何在不冻结事件循环的情况下在 QThread 中休眠/等待
- 如何在主事件循环之前创建一些对象?
- Libuv:保护事件循环免受并发访问
- 防止模式对话框中的事件循环阻塞
- QCoreApplication事件循环和Windows服务控制处理程序功能
- c++ 过期映射条目线程与事件循环
- Qt的事件循环线程是安全的还是原子的?处理"队列连接"时如何同步?
- 在事件循环启动后删除并创建新的 RTP 流
- Qt在游戏循环中短时间内停止关键事件
- QSTATEMACHINE事件循环与动画
- 等待事件循环为空 /等到QT5小部件关闭
- 如何将lambda函数排队到Qt的事件循环中?
- DLL中的QT事件循环
- 运行Qt 5.10事件循环howto的Windows服务service_WIN32_OWN_PROCESS
- 如何在 Windows 上的C++控制台应用程序中捕获 ctrl-c 事件,而不会进入无限循环
- 模态qprogressdialog :: setValue()导致嵌套事件循环崩溃
- 什么是QT中的事件循环