diff --git a/src/gui/kernel/qpalette.cpp b/src/gui/kernel/qpalette.cpp index 22ba5f3bcd..5a0bad9159 100644 --- a/src/gui/kernel/qpalette.cpp +++ b/src/gui/kernel/qpalette.cpp @@ -921,6 +921,17 @@ qint64 QPalette::cacheKey() const return (((qint64) d->ser_no) << 32) | ((qint64) (d->detach_no)); } +static constexpr QPalette::ResolveMask allResolveMask() +{ + QPalette::ResolveMask mask = {0}; + for (int role = 0; role < int(QPalette::NColorRoles); ++role) { + for (int grp = 0; grp < int(QPalette::NColorGroups); ++grp) { + mask |= (QPalette::ResolveMask(1) << bitPosition(QPalette::ColorGroup(grp), QPalette::ColorRole(role))); + } + } + return mask; +} + /*! Returns a new QPalette that is a union of this instance and \a other. Color roles set in this instance take precedence. @@ -934,6 +945,9 @@ QPalette QPalette::resolve(const QPalette &other) const return o; } + if (d->resolveMask == allResolveMask()) + return *this; + QPalette palette(*this); palette.detach(); diff --git a/tests/auto/gui/kernel/qpalette/tst_qpalette.cpp b/tests/auto/gui/kernel/qpalette/tst_qpalette.cpp index 9ef313f36d..5baec3c180 100644 --- a/tests/auto/gui/kernel/qpalette/tst_qpalette.cpp +++ b/tests/auto/gui/kernel/qpalette/tst_qpalette.cpp @@ -122,6 +122,14 @@ void tst_QPalette::resolve() QVERIFY(p2ResolvedTo1 != p1); QVERIFY(p2ResolvedTo1 != p2); + + QPalette p3; + // ensure the resolve mask is full + for (int r = 0; r < QPalette::NColorRoles; ++r) + p3.setBrush(QPalette::All, QPalette::ColorRole(r), Qt::red); + + QPalette p3ResolvedToP1 = p3.resolve(p1); + QVERIFY(p3ResolvedToP1.isCopyOf(p3)); }