diff options
author | Lars Knoll <lars.knoll@digia.com> | 2012-11-20 13:34:06 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2012-11-23 17:04:00 +0100 |
commit | 43619db05d55ca619dac11fdb7327b2b45507cb9 (patch) | |
tree | 189b51b67bc5c6384cc5693a3e6bba01c737d914 /src | |
parent | 3101e48b2c9449e6634a01ceb9a2d79598dbd368 (diff) |
Emit destroyed() signal before children get deleted
Make sure we always emit the destroyed() signal before
we delete our children. This wasn't working correctly
for QWidget based classes, as the QWidget destructor
deletes all children itself.
Task-number: QTBUG-24672
Change-Id: Iecdff3489196271177edfeba1c4a2c5800e255af
Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/corelib/kernel/qobject.cpp | 2 | ||||
-rw-r--r-- | src/widgets/kernel/qwidget.cpp | 18 |
2 files changed, 19 insertions, 1 deletions
diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp index 0d97266f4f..9d0854f3a9 100644 --- a/src/corelib/kernel/qobject.cpp +++ b/src/corelib/kernel/qobject.cpp @@ -766,7 +766,7 @@ QObject::~QObject() delete sharedRefcount; } - if (d->isSignalConnected(0)) { + if (!d->isWidget && d->isSignalConnected(0)) { QT_TRY { emit destroyed(this); } QT_CATCH(...) { diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp index 83dc406e17..d05f53697a 100644 --- a/src/widgets/kernel/qwidget.cpp +++ b/src/widgets/kernel/qwidget.cpp @@ -1429,11 +1429,29 @@ QWidget::~QWidget() delete d->needsFlush; d->needsFlush = 0; + // The next 20 lines are duplicated from QObject, but required here + // since QWidget deletes is children itself + bool blocked = d->blockSig; + d->blockSig = 0; // unblock signals so we always emit destroyed() + + if (d->isSignalConnected(0)) { + QT_TRY { + emit destroyed(this); + } QT_CATCH(...) { + // all the signal/slots connections are still in place - if we don't + // quit now, we will crash pretty soon. + qWarning("Detected an unexpected exception in ~QWidget while emitting destroyed()."); + QT_RETHROW; + } + } + if (d->declarativeData) { QAbstractDeclarativeData::destroyed(d->declarativeData, this); d->declarativeData = 0; // don't activate again in ~QObject } + d->blockSig = blocked; + #ifdef Q_WS_MAC // QCocoaView holds a pointer back to this widget. Clear it now // to make sure it's not followed later on. The lifetime of the |