c++ - aboutToQuit 期间的 Qt 异步操作

标签 c++ macos qt qt4

当我的 Qt 应用程序关闭时,我需要执行一些异步清理事件。

我目前的方法是捕获 aboutToQuit 信号。我启动我的异步行为,然后应用程序关闭。在我的异步行为完成之前,有什么方法可以阻止 Qt 关闭吗?

这通过捕获主窗口的 closeEvent 并在事件上调用 ignore() 来在窗口上工作。但是在 Mac 上,当用户退出时,我的 ignore() 不会被接受,应用程序会在我的异步事件完成之前关闭。

谢谢。

最佳答案

如果无论如何都必须等到代码完成,为什么还要异步启动清理代码?

如果您没有将插槽作为 QueuedConnection 连接到 aboutToQuit,它应该会阻塞,直到您的清理代码完成。

但是如果你真的想异步启动它,你必须手动同步它:

QSemaphore wait4CleanupDone;

class MyQuitHandler { ... public slots: void handleQuit(); ... } myQuitHandler;
void MyQuitHandler::handleQuit() { ... ; wait4CleanupDone.release(); }

int main(int argc, char** argv) {
  QApplication app(argc, argv);
  QObject::connect(&app, SIGNAL(aboutToQuit()), &myQuitHandler, SLOT(handleQuit()));
  ...
  int result = app.exec();
  wait4CleanupDone.acquire();
  return result;
}

但请注意,在某些情况下您的异步代码可能会被忽略:

“我们建议您将清理代码连接到 aboutToQuit() 信号,而不是将其放入应用程序的 main() 函数中。这是因为,在某些平台上,QApplication::exec() 调用可能不会返回例如,在Windows平台上,当用户注销时,系统会在Qt关闭所有顶层窗口后终止进程。因此,无法保证应用程序有时间退出其事件循环并执行代码main() 函数结束,在 QApplication::exec() 调用之后。”

发件人:http://doc.trolltech.com/4.6/qapplication.html#exec

关于c++ - aboutToQuit 期间的 Qt 异步操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2344288/

相关文章:

Xcode - 我更换了硬盘,现在项目无法构建

macos - 如何绑定(bind)80非root

linux - 将 Virtualbox 共享文件夹挂载为在 guest 操作系统上运行的 Docker 的卷

python - 为什么 QFileSystemWatcher 适用于目录而不适用于 Python 中的文件?

c# - 使用 Windows 技术检测复制、粘贴、打印系统命令?

c++ - 静态指针 C++ 用法

c++ - c++中rand()引起的 float 异常

c++ - 如何知道为 Ubuntu 12.04 构建的 OpenCV 2.3.1 设置了哪些标志?

c++ - Qt/C++ 在不使用 dynamic_cast 的情况下将 QGraphicsItem 转换为自定义 QGraphicsItem

c++ - 如何在 QT/C++ 应用程序中添加操作项