Настроить цвет изменённой вкладки QTabWidget

Есть изменённый QTabWidget.

введите сюда описание изображения

Изменён с помощью доп класса

class TabBar(QtWidgets.QTabBar):
def tabSizeHint(self, index):
    s = QtWidgets.QTabBar.tabSizeHint(self, index)
    s.transpose()
    return s

def paintEvent(self, event):
    painter = QtWidgets.QStylePainter(self)
    opt = QtWidgets.QStyleOptionTab()


    for i in range(self.count()):
        self.initStyleOption(opt, i)
        painter.drawControl(QtWidgets.QStyle.CE_TabBarTabShape, opt)
        painter.save()

        s = opt.rect.size()
        s.transpose()
        r = QtCore.QRect(QtCore.QPoint(), s)
        r.moveCenter(opt.rect.center())
        opt.rect = r

        c = self.tabRect(i).center()
        painter.translate(c)
        painter.rotate(90)
        painter.translate(-c)
        painter.drawControl(QtWidgets.QStyle.CE_TabBarTabLabel, opt)

        painter.restore()

Изменение цвета через StyleSheet даёт результат

введите сюда описание изображения

Хочу сделать нормальное изменение цвета. Реализовывал с помощью вот этого решения(отрисовка прямоугольника поверх вкладок) https://progi.pro/izmenenie-cveta-vkladki-qtabwidget-10554526, но такая реализация мне не понравилась.

За отрисовку повернутых вкладок отвечает строчка painter.drawControl(QtWidgets.QStyle.CE_TabBarTabShape, opt). Значит ли это, что в QtWidgets.QStyle заложены цвета по умолчанию для вкладок(нажатие, активная, наведение)? Можно ли их изменить напрямую в QStyle, чтобы всё отрисовывалось как надо?


Ответы (1 шт):

Автор решения: S. Nick

enum QStyle::ControlElement

Это перечисление представляет собой элемент управления. Элемент управления - это часть виджета, которая выполняет какое-либо действие или отображает информацию для пользователя. Больше ... https://doc.qt.io/qt-5/qstyle.html#ControlElement-enum

...
QStyle::CE_TabBarTabShape - Форма вкладки на панели вкладок. QStyle::CE_TabBarTabLabel - Ярлык на вкладке ...

Также вы можете посмотреть другую реализацию с использованием таблицы стилей: Можно ли кастомизировать QTabWidget определенным образом?(PyQt 5, Python 3)

from PyQt5 import QtGui, QtWidgets


class TabBar(QtWidgets.QTabBar):
    def __init__(self, colors, parent=None):
        super(TabBar, self).__init__(parent)
        self.mColors = colors

    def paintEvent(self, event):
        painter = QtWidgets.QStylePainter(self)
        opt = QtWidgets.QStyleOptionTab()

        for i in range(self.count()):
            self.initStyleOption(opt, i)
            if opt.text in self.mColors:
                opt.palette.setColor(
                    QtGui.QPalette.Button, self.mColors[opt.text]
                )
            painter.drawControl(QtWidgets.QStyle.CE_TabBarTabShape, opt)
            painter.drawControl(QtWidgets.QStyle.CE_TabBarTabLabel, opt)


class TabWidget(QtWidgets.QTabWidget):
    def __init__(self, parent=None):
        super(TabWidget, self).__init__(parent)
        d = {
            "All":        QtGui.QColor("yellow"),
            "purchase":   QtGui.QColor("#87ceeb"),
            "POS Sales":  QtGui.QColor("#90EE90"),
            "Cash Sales": QtGui.QColor("pink"),
            "invoice":    QtGui.QColor("#800080"),
        }
        self.setTabBar(TabBar(d))

        self.addTab(QtWidgets.QLabel(), "All")
        self.addTab(QtWidgets.QLabel(), "purchase")
        self.addTab(QtWidgets.QLabel(), "POS Sales")
        self.addTab(QtWidgets.QLabel(), "Cash Sales")
        self.addTab(QtWidgets.QLabel(), "invoice")


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    
    # Внимание!  работает только в том случае, если вы используете стиль fusion, ... 
    app.setStyle("fusion")                                                     # !!!
    
    w = TabWidget()
    w.show()
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка