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:
parent
386a5b85b7
commit
7b5c1063de
|
@ -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);
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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"
|
||||
|
|
Loading…
Reference in New Issue