Avoid unnecessary palette allocations

The palette provider allocates QQuickPalette instances lazily in the
palette() implementation. Since we only only test here whether a palette
is present, uses the non-mutating providesPalette instead.

As a drive-by, remove the paletteData() check from setCurrentColorGroup;
paletteData() asserts if it would return nullptr, so this check is wrong
and misleading.

Amends 3675f2b235.

Pick-to: 6.2
Change-Id: I9701b3520998ec538ef560106a6c6078e7f1c4d8
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
This commit is contained in:
Volker Hilsheimer 2021-06-15 12:45:03 +02:00
parent 386a5b85b7
commit 7b5c1063de
3 changed files with 77 additions and 1 deletions

View File

@ -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);

View File

@ -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"
}
}
}

View File

@ -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"