5

我的 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

1 回答 1

10

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

需要注意可能的问题,并且在调用时不要让应用程序处于不一致的状态exec(),并且不要依赖于事后的状态。

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

于 2015-11-09T10:12:22.703 回答