如何正确关闭Qt程序?

10

当我尝试关闭我的Qt程序时,即使没有窗口了,它仍然在后台运行。

基本上,我想知道当我点击主窗口上的红色叉号(没有父窗口)时,应该怎么做才能使它正确地关闭。

按照这个链接,我尝试了一些方法,比如:

QApplication app(argc, argv);
//...
app.connect(&app, SIGNAL(lastWindowClosed()), &app, SLOT(quit()));
return app.exec();
或者
QApplication app(argc, argv);
//...
app.setQuitOnLastWindowClosed(true);
return app.exec();

但是两者都不起作用,关闭程序后它仍然停留在内存中,即使点击了叉子。

那么,我该如何正确地关闭我的程序?

1个回答

14

您可以使用QApplication::quit()手动关闭应用程序。

默认情况下,当具有 Qt::WA_QuitOnClose 属性的最后一个顶层窗口被关闭时,执行会终止。您不需要将 lastWindowClosed 连接到 quit,因为它会重复默认的 setQuitOnLastWindowClosed 行为。您也不需要执行 setQuitOnLastWindowClosed(true),因为它默认为 true。您发布的代码什么也没做(如果没有在其他地方进行更改)。

可能的解决方法:

  • 检查您的主窗口属性。也许您已经删除了 Qt::WA_QuitOnClose 属性。
  • 如果您已经重新实现了顶级窗口中的 closeEvent,请检查该关闭事件是否被接受。
  • 检查是否存在一些其他可能被隐藏但未关闭的顶级小部件。使用 QApplication::topLevelWidgets() 列出它们。

谢谢,我会尝试这个方法。虽然我没有使用 Qt::WA_QuitOnClose 属性,但我会尝试重新实现 closeEvent() 方法。在搜索时我没有看到相关内容。 - JBL
不,如果您不需要重新实现closeEvent,就不应该这样做。它应该默认工作良好。我的意思是,如果您重新实现了closeEvent,那么您的实现可能是不正确的。 - Pavel Strakhov
哦,确实。嗯,我根本没有重新实现它...那么,我该怎么办呢?我必须绝对依赖于 QApplication::quit() 吗? - JBL
尝试使用 qDebug() << 获取一些关于它们的信息(至少是类名)。同时尝试遍历列表并为每个小部件调用 show()。这将帮助您找出这些小部件是什么。 - Pavel Strakhov
请查看QDialog::QDialog()文档:“对话框始终是顶层小部件,但如果它有父级,则默认位置位于父级正中央。” 我认为QMenu不会引起问题。可能是因为已经禁用了它们的Qt::WA_QuitOnClose标志。 - Pavel Strakhov
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接