QTabBar: don't let tab shine through (semi-transparent) scroll buttons

On styles where the tab bar's scroll buttons are rendered semi-
transparently, or where the buttons don't fill their entire rect (for
example have rounded edges), the tab that's covered by the buttons
should not shine through the gaps, or even shine through the button.

Clip the painter so that the area of each button is not painted by the
tabs.

Fixes: QTBUG-50866
Change-Id: Ie81f6d260f36d5a17868822e683745844a6a6b2f
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
(cherry picked from commit 0965cf0f1e49185097b0698e51ea9ad464eaa573)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Volker Hilsheimer 2021-06-05 11:29:11 +02:00 committed by Qt Cherry-pick Bot
parent 93450a6ab2
commit 460ad31c7a

View File

@ -1833,6 +1833,20 @@ void QTabBar::paintEvent(QPaintEvent *)
if (d->drawBase)
p.drawPrimitive(QStyle::PE_FrameTabBarBase, optTabBase);
// the buttons might be semi-transparent or not fill their rect, but we don't
// want the tab underneath to shine through, so clip the button area; QTBUG-50866
if (d->leftB->isVisible() || d->rightB->isVisible()) {
QStyleOption opt;
opt.initFrom(this);
QRegion buttonRegion;
if (d->leftB->isVisible())
buttonRegion |= style()->subElementRect(QStyle::SE_TabBarScrollLeftButton, &opt, this);
if (d->rightB->isVisible())
buttonRegion |= style()->subElementRect(QStyle::SE_TabBarScrollRightButton, &opt, this);
if (!buttonRegion.isEmpty())
p.setClipRegion(QRegion(rect()) - buttonRegion);
}
for (int i = 0; i < d->tabList.count(); ++i) {
const auto tab = d->tabList.at(i);
if (!tab->visible)