PyQt5中自定义QTabWidget无法应用样式表问题
解决自定义QTabWidget标签背景色样式表不生效的问题
问题出在你重写了HorizontalTabBar的paintEvent方法,默认的样式表渲染逻辑被自定义绘制覆盖,导致设置的QTabBar::tab背景色规则无法自动应用。需要修改自定义绘制逻辑,手动结合样式表的颜色设置来绘制标签背景。
修改后的完整代码
from PyQt5 import QtCore, QtWidgets class HorizontalTabBar(QtWidgets.QTabBar): def paintEvent(self, event): painter = QtWidgets.QStylePainter(self) option = QtWidgets.QStyleOptionTab() for index in range(self.count()): self.initStyleOption(option, index) tab_rect = self.tabRect(index) # 根据标签状态从样式表获取对应背景色 if option.state & QtWidgets.QStyle.State_Selected: bg_color = self.palette().color(QtWidgets.QPalette.Highlight) else: bg_color = self.palette().color(QtWidgets.QPalette.Button) # 先绘制背景色 painter.fillRect(tab_rect, bg_color) # 绘制标签形状(边框等样式) painter.drawControl(QtWidgets.QStyle.CE_TabBarTabShape, option) # 绘制标签文本 painter.drawText(tab_rect, QtCore.Qt.AlignCenter | QtCore.Qt.TextDontClip, self.tabText(index)) def tabSizeHint(self, index): size = QtWidgets.QTabBar.tabSizeHint(self, index) if size.width() < size.height(): size.transpose() return size class RTabWidget(QtWidgets.QTabWidget): def __init__(self, parent=None): QtWidgets.QTabWidget.__init__(self, parent) self.setTabBar(HorizontalTabBar()) self.setStyleSheet(""" QTabBar::tab { background-color: rgb(18, 18, 18); color: white; /* 可选:设置文本颜色,避免深色背景下看不清 */ } QTabBar::tab:selected { background-color: rgb(81, 81, 81); } QTabWidget::pane { border: 1px solid #121212; background-color: rgb(81, 81, 81); } """)
关键修改说明
- 在
paintEvent中,通过self.palette().color()获取样式表中定义的颜色:- 未选中标签对应
QPalette.Button颜色,匹配样式表QTabBar::tab的background-color - 选中标签对应
QPalette.Highlight颜色,匹配样式表QTabBar::tab:selected的background-color
- 未选中标签对应
- 先调用
painter.fillRect()绘制背景色,再执行原有的drawControl和drawText操作,确保背景色能正确显示在最底层。
内容的提问来源于stack exchange,提问作者RamiN
相关产品推荐
相关产品推荐

