aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/quick/items/qquickitem.cpp2
-rw-r--r--tests/auto/quick/qquickitem2/data/paletteAllocate.qml35
-rw-r--r--tests/auto/quick/qquickitem2/tst_qquickitem.cpp41
3 files changed, 77 insertions, 1 deletions
diff --git a/src/quick/items/qquickitem.cpp b/src/quick/items/qquickitem.cpp
index 5b8048c303..ff269363bb 100644
--- a/src/quick/items/qquickitem.cpp
+++ b/src/quick/items/qquickitem.cpp
@@ -8507,7 +8507,7 @@ bool QQuickItem::event(QEvent *ev)
break;
case QEvent::WindowActivate:
case QEvent::WindowDeactivate:
- if (d->palette())
+ if (d->providesPalette())
d->setCurrentColorGroup();
for (QQuickItem *item : d->childItems)
QCoreApplication::sendEvent(item, ev);
diff --git a/tests/auto/quick/qquickitem2/data/paletteAllocate.qml b/tests/auto/quick/qquickitem2/data/paletteAllocate.qml
new file mode 100644
index 0000000000..6c959ddbcb
--- /dev/null
+++ b/tests/auto/quick/qquickitem2/data/paletteAllocate.qml
@@ -0,0 +1,35 @@
+import QtQuick
+
+Item {
+ id: root
+ width: 300
+ height: 300
+ visible: true
+
+ palette.active.base: "blue"
+ palette.inactive.base: "red"
+ palette.disabled.base: "gray"
+
+ Rectangle {
+ id: background
+ objectName: "background"
+
+ anchors.centerIn: parent
+ width: parent.width / 2
+ height: parent.height / 2
+
+ color: root.palette.base
+
+ Rectangle {
+ id: foreground
+ objectName: "foreground"
+
+ anchors.centerIn: parent
+ width: parent.width / 2
+ height: parent.height / 2
+
+ color: root.palette.base
+ border.color: "black"
+ }
+ }
+}
diff --git a/tests/auto/quick/qquickitem2/tst_qquickitem.cpp b/tests/auto/quick/qquickitem2/tst_qquickitem.cpp
index 843b916eb1..4d381d59a3 100644
--- a/tests/auto/quick/qquickitem2/tst_qquickitem.cpp
+++ b/tests/auto/quick/qquickitem2/tst_qquickitem.cpp
@@ -134,7 +134,9 @@ private slots:
void isAncestorOf();
void grab();
+
void colorGroup();
+ void paletteAllocated();
private:
QQmlEngine engine;
@@ -3770,6 +3772,45 @@ void tst_QQuickItem::colorGroup()
QCOMPARE(foreground->property("color").value<QColor>(), palette->inactive()->base());
}
+/*!
+ Verify that items don't allocate their own QQuickPalette instance
+ unnecessarily.
+*/
+void tst_QQuickItem::paletteAllocated()
+{
+ QQuickView view;
+
+ view.setSource(testFileUrl("paletteAllocate.qml"));
+
+ QQuickItem *root = qobject_cast<QQuickItem *>(view.rootObject());
+ QQuickItem *background = root->findChild<QQuickItem *>("background");
+ QVERIFY(background);
+ QQuickItem *foreground = root->findChild<QQuickItem *>("foreground");
+ QVERIFY(foreground);
+
+ bool backgroundHasPalette = false;
+ bool foregroundHasPalette = false;
+ QObject::connect(background, &QQuickItem::paletteCreated, this, [&]{ backgroundHasPalette = true; });
+ QObject::connect(foreground, &QQuickItem::paletteCreated, this, [&]{ foregroundHasPalette = true; });
+
+ view.show();
+ view.requestActivate();
+ QVERIFY(QTest::qWaitForWindowActive(&view));
+
+ QVERIFY(!backgroundHasPalette);
+ QVERIFY(!foregroundHasPalette);
+
+ view.close();
+
+ QVERIFY(!backgroundHasPalette);
+ QVERIFY(!foregroundHasPalette);
+
+ auto quickpalette = foreground->property("palette").value<QQuickPalette*>();
+ QVERIFY(!backgroundHasPalette);
+ QVERIFY(quickpalette);
+ QVERIFY(foregroundHasPalette);
+}
+
QTEST_MAIN(tst_QQuickItem)
#include "tst_qquickitem.moc"