gpt4 book ai didi

c++ - 在插槽中调用 QDialog::exec 是否会阻塞主事件循环?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:06:56 24 4
gpt4 key购买 nike

我的 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作者说

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 是否会阻塞主事件循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33605186/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com