diff options
author | J-P Nurmi <jpnurmi@qt.io> | 2016-05-14 09:33:55 +0200 |
---|---|---|
committer | J-P Nurmi <jpnurmi@qt.io> | 2016-05-18 09:25:57 +0000 |
commit | b6ecb5a4d14663dc00d8179f590e86bfd52c6881 (patch) | |
tree | 36a7e931d17e155af02eadd70f93adfa9fee7abe | |
parent | ca87ab8c9b42e329d5db61deb4736ad5e628fffe (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.cpp | 17 | ||||
-rw-r--r-- | src/quickcontrols2/qquickstyleattached_p.h | 2 | ||||
-rw-r--r-- | tests/auto/material/data/tst_material.qml | 19 | ||||
-rw-r--r-- | tests/auto/universal/data/tst_universal.qml | 20 |
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" } |