Настроить цвет изменённой вкладки 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 шт):
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_())


