aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@theqtcompany.com>2016-01-31 10:42:11 +0100
committerJ-P Nurmi <jpnurmi@theqtcompany.com>2016-02-02 17:21:59 +0000
commit6d8f6a7e406515df358bacc6f737f4fe5fae97ea (patch)
tree3539b9e9cfca060a70c0d33f3361ce5599e58476
parent7b38d8e0025aba6366fd2f222838cf99f6bd15f3 (diff)
Window attached property: fix notifier signals
The change notifiers must be emitted when an item's window is reset. Otherwise any existing bindings don't get re-evaluated, and in worst scenario one ends up with dangling pointers. Change-Id: I6075957f1447bb8628d25bd822345e45837c027a Reviewed-by: Shawn Rutledge <shawn.rutledge@theqtcompany.com>
-rw-r--r--src/quick/items/qquickwindowattached.cpp16
-rw-r--r--tests/auto/quick/qquickwindow/tst_qquickwindow.cpp5
2 files changed, 13 insertions, 8 deletions
diff --git a/src/quick/items/qquickwindowattached.cpp b/src/quick/items/qquickwindowattached.cpp
index e33e32631c..b1961386bb 100644
--- a/src/quick/items/qquickwindowattached.cpp
+++ b/src/quick/items/qquickwindowattached.cpp
@@ -89,21 +89,21 @@ void QQuickWindowAttached::windowChanged(QQuickWindow *window)
if (oldWindow)
oldWindow->disconnect(this);
- if (!window)
- return; // No values to get, therefore nothing to emit
-
- if (!oldWindow || window->visibility() != oldWindow->visibility())
+ if (!oldWindow || !window || window->visibility() != oldWindow->visibility())
emit visibilityChanged();
- if (!oldWindow || window->isActive() != oldWindow->isActive())
+ if (!oldWindow || !window || window->isActive() != oldWindow->isActive())
emit activeChanged();
- if (!oldWindow || window->activeFocusItem() != oldWindow->activeFocusItem())
+ if (!oldWindow || !window || window->activeFocusItem() != oldWindow->activeFocusItem())
emit activeFocusItemChanged();
emit contentItemChanged();
- if (!oldWindow || window->width() != oldWindow->width())
+ if (!oldWindow || !window || window->width() != oldWindow->width())
emit widthChanged();
- if (!oldWindow || window->height() != oldWindow->height())
+ if (!oldWindow || !window || window->height() != oldWindow->height())
emit heightChanged();
+ if (!window)
+ return;
+
// QQuickWindowQmlImpl::visibilityChanged also exists, and window might even
// be QQuickWindowQmlImpl, but that's not what we are connecting to.
// So this is actual window state rather than a buffered or as-requested one.
diff --git a/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp b/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp
index f53ade9541..c597cf03dd 100644
--- a/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp
+++ b/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp
@@ -2050,6 +2050,11 @@ void tst_qquickwindow::attachedProperty()
QCOMPARE(text->property("contentItem").value<QQuickItem*>(), innerWindow->contentItem());
QCOMPARE(text->property("windowWidth").toInt(), innerWindow->width());
QCOMPARE(text->property("windowHeight").toInt(), innerWindow->height());
+
+ text->setParentItem(0);
+ QVERIFY(!text->property("contentItem").value<QQuickItem*>());
+ QCOMPARE(text->property("windowWidth").toInt(), 0);
+ QCOMPARE(text->property("windowHeight").toInt(), 0);
}
class RenderJob : public QRunnable