Существует два возможных решения этой проблемы.
Основная причина такого поведения может быть найдена в используемом стиле .
Каждый стиль Qt решает, как цвета палитры используются для рисования виджета. Это означает, что даже если вы установите определенный c цвет для (скажем, фона), не гарантирует, что виджет будет иметь этот указанный c цвет фона.
Эту концепцию лучше объяснить, если подумать о кнопках: они часто имеют «градиент оттенка», который основан на роли цвета Button
, но фон не является точно этим цветом. На следующем изображении я показываю кнопку, для которой я установил простой красный (# ff0000) цвет для роли кнопки, но, как вы можете видеть, это , а не красный:
Цвета палитры на самом деле являются справочными.
Некоторые виджеты не имеют определенной c роли для их поведения при рисовании, и именно стиль решает, какую роль использовать и как, и это в случае с QTabWidget. На Linux стилем по умолчанию обычно является «Fusion», который использует роль Button
для рисования фона виджета со вкладками, но когда этот фон закрашивается, используется градиент на основе этого цвета вместо. Снова, полный красный цвет, примененный к роли Button
(иначе, фон виджета со вкладками), который не является реальным красным:
Для этого есть два возможных решения.
1. Используйте другой стиль
Стиль "Кислород" кажется более согласованным с родительским фоном при работе с QTabWidget.
def main():
app = QApplication([])
app.setStyle(QStyleFactory.create('oxygen'))
Чтобы узнать, какие стили установлены в системе, просто наберите QStyleFactory.keys()
. Обратите внимание, что не все стили доступны для каждой системы. Обычно доступны «Fusion» и «Windows», что означает, что если вы попытаетесь получить доступ к стилю «Кислород», а он не установлен, вместо него будет использован запасной стиль.
2. Используйте исчерпывающую таблицу стилей для панели вкладок
Причина, по которой вкладка не использует фон, заданный таблицей стилей, связана с тем, что стиль (слияние) все еще использует вышеупомянутый градиент, примененный к цвету фона. И это потому, что вкладка может иметь другой цвет, независимо от того, выделена она или нет (в частности, светлее, чем фон, если она выбрана, темнее, если нет).
Чтобы избежать этого, вам нужно установить таблицу стилей для всех псевдосостояний панели вкладок.
bgd = 'rgba({}, {}, {}, {})'.format(*self.palette().color(QPalette.Window).getRgb())
# get the default margins for layouts and use them for text padding of
# the tab; obviously, you can use your own default padding instead
margins = []
for side in (QStyle.PM_LayoutTopMargin, QStyle.PM_LayoutRightMargin, QStyle.PM_LayoutBottomMargin, QStyle.PM_LayoutLeftMargin):
margin = self.style().pixelMetric(side, None, None)
if side in (QStyle.PM_LayoutTopMargin, QStyle.PM_LayoutBottomMargin):
margin //= 2
margins.append('{}px'.format(margin))
padding = ' '.join(margins)
self.tabWidget.setStyleSheet('''
/* this selector applies the background color only to QWidgets that
are direct children of QTabWidget */
QTabWidget > QWidget {{
background-color: {bgd};
}}
QTabBar::tab {{
padding: {padding};
border-left: 1px solid palette(mid);
border-right: 1px solid palette(mid);
border-top: 1px solid palette(mid);
border-top-left-radius: 2px;
border-top-right-radius: 2px;
border-bottom: 1px solid palette(mid);
margin: 0;
}}
QTabBar::tab:selected {{
border-color: palette(dark);
border-bottom: none;
}}
QTabBar::tab:!selected {{
margin-top: 2px;
margin-bottom: -2px;
}}
'''.format(bgd=bgd, padding=padding))
И вот результат: