aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@qt.io>2016-04-27 16:21:52 +0200
committerJ-P Nurmi <jpnurmi@qt.io>2016-04-27 16:06:37 +0000
commit0b9c0ac7a945ca896f4719efbe461f017cfb2044 (patch)
treeea55eee613ffa2a8c12d1f95c474bca98ae031f2
parent40e1e6bc66aa3d59600bafc18d5f41106cf9707d (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>
-rw-r--r--src/templates/qquickapplicationwindow.cpp9
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;