我总是无法正确关闭我的 Qt 应用程序。从 Qt::Application 退出时应该注意什么?我想编译一个清单,我可以按照该清单正确退出所有部分,具体取决于程序使用的功能。例如,如果我使用 QThreads,需要做些什么来确保它们被正确关闭,等等所有其他可能需要特别注意的部分。
我希望我不是唯一一个遇到此类问题的人,事实证明它对许多人有用。
在 QThread 的情况下,使用信号和槽机制,您可以让 QThread 在完成时自动删除自己:-
// Note - using Qt 5 connect style
QThread* pThread = new QThread;
connect(pThread, &QThread::finished, pThread, &QThread::deleteLater);
现在所要做的就是让线程完成处理,或者线程的所有者调用 pThread->quit()。
这里有一篇关于如何正确使用 QThreads 的好文章。
对于所有其他 Qt 类,只要一个对象/小部件实例有父对象,那么 Qt 就会处理所有子对象的删除。通常,顶级小部件是一个在关闭时将被删除的窗口。
除了正确的 C++ 设计之外,没有清单。不幸的是, AQThread
没有提供任何合理的默认破坏行为。在 C++ 领域,这在名义上是一个禁忌。你需要一些QObject
拥有你的线程的东西,并且在消失之前,注意退出或终止它们,然后在它们被销毁之前等待它们。您自己编写的所有类也是如此:它们在被破坏时必须正确运行。当 Qt 的各种类的实例被删除时,Qt 通常会采取适当的行动,QThread
这确实很出色。
一旦您遵循 C++ 设计的基本原则,即对象在销毁时释放资源,您就不会有任何问题。使用智能指针,包括 C++11(如果可用)。QPointer
, QSharedPointer
,QScopedPointer
都是你的朋友。