Как раскрасить 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.


person JohnSantaFe    schedule 06.11.2013    source источник


Ответы (2)


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

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

self.setStyleSheet(stylesheet)

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

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

person Yoann Quenach de Quivillic    schedule 06.11.2013
comment
Это сработало хорошо. Пришлось добавить радиуса углам и изменить цвет текста, но в целом сделал то, что хотел. Спасибо. - person JohnSantaFe; 07.11.2013
comment
Есть ли способ сделать фон вкладки прозрачным? - person tokageKitayama; 19.08.2016

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

    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.

person ekhumoro    schedule 06.11.2013