diff options
author | J-P Nurmi <jpnurmi@qt.io> | 2016-04-27 16:21:52 +0200 |
---|---|---|
committer | J-P Nurmi <jpnurmi@qt.io> | 2016-04-27 16:06:37 +0000 |
commit | 0b9c0ac7a945ca896f4719efbe461f017cfb2044 (patch) | |
tree | ea55eee613ffa2a8c12d1f95c474bca98ae031f2 /src/templates | |
parent | 40e1e6bc66aa3d59600bafc18d5f41106cf9707d (diff) |
Fix QQuickApplicationWindowAttached::windowChange()
QQuickWindow::windowChange() is emitted from QQuickWindow destructor.
This means, that QQuickApplicationWindow destructor has been already
executed, and thus, QQuickApplicationWindowPrivate has been deleted.
The issue was found with Valgrind. A workaround is to explicitly reset
the d-pointer so that we can test whether it's still valid.
Change-Id: I82d388d8aae18886ec92ef09c745a1c045f46a39
Task-number: QTBUG-52731
Reviewed-by: J-P Nurmi <jpnurmi@qt.io>
Diffstat (limited to 'src/templates')
-rw-r--r-- | src/templates/qquickapplicationwindow.cpp | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/src/templates/qquickapplicationwindow.cpp b/src/templates/qquickapplicationwindow.cpp index 00ca38fb..3edc6cc9 100644 --- a/src/templates/qquickapplicationwindow.cpp +++ b/src/templates/qquickapplicationwindow.cpp @@ -104,6 +104,11 @@ public: , activeFocusControl(Q_NULLPTR) { } + static QQuickApplicationWindowPrivate *get(QQuickApplicationWindow *window) + { + return window->d_func(); + } + void relayout(); void itemImplicitWidthChanged(QQuickItem *item) Q_DECL_OVERRIDE; @@ -226,6 +231,7 @@ QQuickApplicationWindow::~QQuickApplicationWindow() QQuickItemPrivate::get(d->header)->removeItemChangeListener(d, QQuickItemPrivate::ImplicitWidth | QQuickItemPrivate::ImplicitHeight); if (d->footer) QQuickItemPrivate::get(d->footer)->removeItemChangeListener(d, QQuickItemPrivate::ImplicitWidth | QQuickItemPrivate::ImplicitHeight); + d_ptr.reset(); } /*! @@ -495,6 +501,9 @@ public: void QQuickApplicationWindowAttachedPrivate::windowChange(QQuickWindow *wnd) { Q_Q(QQuickApplicationWindowAttached); + if (window && !QQuickApplicationWindowPrivate::get(window)) + window = Q_NULLPTR; // being deleted (QTBUG-52731) + QQuickApplicationWindow *newWindow = qobject_cast<QQuickApplicationWindow *>(wnd); if (window != newWindow) { QQuickApplicationWindow *oldWindow = window; |