aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@qt.io>2016-05-14 09:33:55 +0200
committerJ-P Nurmi <jpnurmi@qt.io>2016-05-18 09:25:57 +0000
commitb6ecb5a4d14663dc00d8179f590e86bfd52c6881 (patch)
tree36a7e931d17e155af02eadd70f93adfa9fee7abe
parentca87ab8c9b42e329d5db61deb4736ad5e628fffe (diff)
Fix style inheritance with dynamically changing windows
It can happen that the parent item changes before an item gets associated with a window. Change-Id: I4cb65a06d363f8211b202e559c76793c71ba318a Reviewed-by: Nikita Krupenko <krnekit@gmail.com> Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
-rw-r--r--src/quickcontrols2/qquickstyleattached.cpp17
-rw-r--r--src/quickcontrols2/qquickstyleattached_p.h2
-rw-r--r--tests/auto/material/data/tst_material.qml19
-rw-r--r--tests/auto/universal/data/tst_universal.qml20
4 files changed, 56 insertions, 2 deletions
diff --git a/src/quickcontrols2/qquickstyleattached.cpp b/src/quickcontrols2/qquickstyleattached.cpp
index 8b035455..d0df79c5 100644
--- a/src/quickcontrols2/qquickstyleattached.cpp
+++ b/src/quickcontrols2/qquickstyleattached.cpp
@@ -39,6 +39,7 @@
#include <QtCore/qfile.h>
#include <QtCore/qsettings.h>
#include <QtCore/qfileselector.h>
+#include <QtQuick/qquickwindow.h>
#include <QtQuick/private/qquickitem_p.h>
#include <QtQuickTemplates2/private/qquickpopup_p.h>
@@ -154,15 +155,19 @@ QQuickStyleAttached::QQuickStyleAttached(QObject *parent) : QObject(parent)
item = popup->popupItem();
}
- if (item)
+ if (item) {
+ connect(item, &QQuickItem::windowChanged, this, &QQuickStyleAttached::itemWindowChanged);
QQuickItemPrivate::get(item)->addItemChangeListener(this, QQuickItemPrivate::Parent);
+ }
}
QQuickStyleAttached::~QQuickStyleAttached()
{
QQuickItem *item = qobject_cast<QQuickItem *>(parent());
- if (item)
+ if (item) {
+ disconnect(item, &QQuickItem::windowChanged, this, &QQuickStyleAttached::itemWindowChanged);
QQuickItemPrivate::get(item)->removeItemChangeListener(this, QQuickItemPrivate::Parent);
+ }
setParentStyle(nullptr);
}
@@ -222,6 +227,14 @@ void QQuickStyleAttached::parentStyleChange(QQuickStyleAttached *newParent, QQui
Q_UNUSED(oldParent);
}
+void QQuickStyleAttached::itemWindowChanged(QQuickWindow *window)
+{
+ Q_UNUSED(window);
+ QQuickItem *item = qobject_cast<QQuickItem *>(sender());
+ if (item)
+ setParentStyle(findParentStyle(metaObject(), item));
+}
+
void QQuickStyleAttached::itemParentChanged(QQuickItem *item, QQuickItem *parent)
{
Q_UNUSED(parent);
diff --git a/src/quickcontrols2/qquickstyleattached_p.h b/src/quickcontrols2/qquickstyleattached_p.h
index 67938290..13b816f2 100644
--- a/src/quickcontrols2/qquickstyleattached_p.h
+++ b/src/quickcontrols2/qquickstyleattached_p.h
@@ -59,6 +59,7 @@
QT_BEGIN_NAMESPACE
class QSettings;
+class QQuickWindow;
class Q_QUICKCONTROLS2_PRIVATE_EXPORT QQuickStyleAttached : public QObject, public QQuickItemChangeListener
{
@@ -80,6 +81,7 @@ protected:
virtual void parentStyleChange(QQuickStyleAttached *newParent, QQuickStyleAttached *oldParent);
+ void itemWindowChanged(QQuickWindow *window);
void itemParentChanged(QQuickItem *item, QQuickItem *parent) override;
private:
diff --git a/tests/auto/material/data/tst_material.qml b/tests/auto/material/data/tst_material.qml
index 25b4ec98..2e7390c2 100644
--- a/tests/auto/material/data/tst_material.qml
+++ b/tests/auto/material/data/tst_material.qml
@@ -426,6 +426,25 @@ TestCase {
window.destroy()
}
+ function test_windowChange() {
+ var ldr = loader.createObject()
+ verify(ldr)
+
+ var wnd = window.createObject()
+ verify(wnd)
+
+ wnd.Material.theme = Material.Dark
+ compare(wnd.Material.theme, Material.Dark)
+
+ ldr.active = true
+ verify(ldr.item)
+ compare(ldr.item.Material.theme, Material.Light)
+
+ ldr.parent = wnd.contentItem
+ compare(ldr.item.Material.theme, Material.Dark)
+
+ wnd.destroy()
+ }
function test_colors_data() {
return [
diff --git a/tests/auto/universal/data/tst_universal.qml b/tests/auto/universal/data/tst_universal.qml
index a88f2c49..0bc0d09d 100644
--- a/tests/auto/universal/data/tst_universal.qml
+++ b/tests/auto/universal/data/tst_universal.qml
@@ -318,6 +318,26 @@ TestCase {
window.destroy()
}
+ function test_windowChange() {
+ var ldr = loader.createObject()
+ verify(ldr)
+
+ var wnd = window.createObject()
+ verify(wnd)
+
+ wnd.Universal.theme = Universal.Dark
+ compare(wnd.Universal.theme, Universal.Dark)
+
+ ldr.active = true
+ verify(ldr.item)
+ compare(ldr.item.Universal.theme, Universal.Light)
+
+ ldr.parent = wnd.contentItem
+ compare(ldr.item.Universal.theme, Universal.Dark)
+
+ wnd.destroy()
+ }
+
function test_colors_data() {
return [
{ tag: "accent" }, { tag: "background" }, { tag: "foreground" }