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:退出应用程序->正确清理的清单的主要内容,如果未能解决你的问题,请参考以下文章