У меня всегда проблемы с закрытием моих 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().
Там большая статья здесь о том, как использовать правильно объекты QThread.
Что касается всех других классов Qt, если экземпляр объекта/виджета имеет родительский элемент, то Qt будет обрабатывать удаление всех дочерних объектов. Часто виджет верхнего уровня - это окно, которое будет удалено при закрытии.
Нет контрольного списка за пределами C++ дизайна. QThread
, к сожалению, не предлагает никаких разумных по умолчанию действий по уничтожению. В C++ земле, что номинально нет-нет. Вам нужен QObject
который владеет вашими потоками и перед тем, как исчезнуть сам, позаботится о том, чтобы либо выйти, либо прекратить их, после чего их ждет, прежде чем они будут уничтожены. То же самое касается всех классов, которые вы написали сами: они должны действовать должным образом при разрушении. Qt обычно действует надлежащим образом, когда экземпляры его различных классов удалены, QThread
- действительно выдающийся.
После того, как вы будете следовать базовому принципу дизайна C++, а именно, что объекты уничтожают ресурсы при уничтожении, у вас не будет никаких проблем. Используйте интеллектуальные указатели, включая C++ 11, если они доступны. QPointer
, QSharedPointer
, QScopedPointer
- все ваши друзья.