Как раскрасить PyQt QTabwidget

У меня есть главное окно PyQt, которое содержит QTabWidget. Виджет со вкладками содержит несколько кнопок и текстовых полей.

Я хотел бы раскрасить весь фон вкладок, а не только вкладки, которые торчат в области панели вкладок.

Я не использую таблицы стилей и предпочел бы использовать палитру, поскольку я уже использую палитры, но если таблицы стилей являются единственным вариантом, это нормально.

Я пробовал:

p = self.tabWidget.palette()
p.setColor(self.tabWidget.backgroundRole(), Qt.red)
self.tabWidget.setPalette(p)

Это приводит к появлению красной области панели вкладок, но основной фон остается белым.

Отключение автозаполнения с помощью self.tabWidget.setAutoFillBackground(False) делает небольшую разницу, отдельные вкладки теперь красиво окрашены, но основная часть остается белой.

Пробуем небольшую таблицу стилей:

self.tabWidget.setStyleSheet("QWidget {background-color: yellow }")

Это окрашивает основную часть вкладки, но также окрашивает все остальное в желтый, включая кнопки и текстовые поля. Кроме того, все маленькие вкладки, которые торчат, желтые. Автозаполнение не оказало никакого влияния.

Любые идеи о том, как покрасить тело вкладки, но не уничтожить другие виджеты?

Я использую PyQt версии 4.10 и Python 2.7.

2 ответа

Используя StyleSheet, вы можете сделать что-то вроде этого:

stylesheet = """ 
    QTabBar::tab:selected {background: gray;}
    QTabWidget>QWidget>QWidget{background: gray;}
    """

self.setStyleSheet(stylesheet)

Шевроны позволяют ссылаться на ребенка виджета. Он говорит Qt применить таблицу стилей к внукам любого QTabWidget в вашем приложении (см. Синтаксис Qt StlyleSheet). Вкладка "тело" - это внучка QTabWidget.

Он не очень хорошо рендерится, вам придется изменить некоторые настройки. Смотрите документацию Qt по настройке QTabWidget и QTabBar.

Если вы просто хотите закрасить фон тела вкладки, установите фоновую роль его виджета содержимого верхнего уровня:

    widget = QtGui.QWidget(tabwidget)
    widget.setAutoFillBackground(True)
    palette = widget.palette()
    palette.setColor(widget.backgroundRole(), QtCore.Qt.red)
    widget.setPalette(palette)
    # add layout and child widgets
    ...
    self.addTab(widget, label)

Подобный вопрос задавался ранее, и кажется, что когда дело доходит до раскраски вкладок, таблицы стилей могут быть единственным решением, которое будет работать на всех платформах. Это зависит от того, чего именно вы пытаетесь достичь.

Мой ответ на этот вопрос переопределяет событие рисования панели вкладок и работает довольно хорошо - но только в Linux.

Другие вопросы по тегам