Qt:退出应用程序->正确清理的清单

Posted

技术标签:

【中文标题】Qt:退出应用程序->正确清理的清单【英文标题】:Qt: Quit application -> checklist for proper clean up 【发布时间】:2013-10-07 14:22:32 【问题描述】:

我总是无法正确关闭我的 Qt 应用程序。从 Qt::Application 退出时应该注意什么?我想编译一个清单,我可以按照该清单正确退出所有部分,具体取决于程序使用的功能。例如,如果我使用 QThreads,需要做些什么来确保它们被正确关闭,等等所有其他可能需要特别注意的部分。

我希望我不是唯一一个遇到此类问题的人,事实证明它对许多人有用。

【问题讨论】:

【参考方案1】:

除了正确的 C++ 设计之外,没有清单。不幸的是,QThread 没有提供任何合理的默认破坏行为。在 C++ 领域,这在名义上是一个禁忌。您需要一些拥有您的线程的QObject,并且在自行消失之前,注意退出或终止它们,然后在它们被销毁之前等待它们。您自己编写的所有类也是如此:它们在被破坏时必须正确运行。 Qt 通常在其各个类的实例被删除时会适当地执行,QThread 确实很出色。

一旦你遵循 C++ 设计的基本原则,即对象在销毁时释放资源,你就不会有任何问题。使用智能指针,包括 C++11(如果可用)。 QPointer, QSharedPointer, QScopedPointer 都是你的朋友。

【讨论】:

【参考方案2】:

在 QThread 的情况下,使用信号和槽机制,您可以让 QThread 在完成时自动删除自己:-

// Note - using Qt 5 connect style
QThread* pThread = new QThread;
connect(pThread, &QThread::finished, pThread, &QThread::deleteLater);

现在所要做的就是让线程完成处理,或者线程的所有者调用 pThread->quit()。

有一篇很棒的文章here 介绍了如何正确使用 QThreads。

对于所有其他 Qt 类,只要一个对象/部件实例有父对象,那么 Qt 将处理所有子对象的删除。通常,***小部件是一个在关闭时将被删除的窗口。

【讨论】:

以上是关于Qt:退出应用程序->正确清理的清单的主要内容,如果未能解决你的问题,请参考以下文章

Qt/MFC 迁移框架工具:正确退出 DLL?

如何从主窗体完全/正确退出 Qt 程序?

运行程序时 QT Creator 以代码 0 退出

Qt 调试崩溃/退出 python 并最终无法正确调试(例如,不在断点处停止)

Qt 中的退出应用程序

如何正确清理视图模型?