You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
            }
        """)

关键修改说明

  1. 在paintEvent中,通过self.palette().color()获取样式表中定义的颜色:
    • 未选中标签对应QPalette.Button颜色,匹配样式表QTabBar::tab的background-color
    • 选中标签对应QPalette.Highlight颜色,匹配样式表QTabBar::tab:selected的background-color
  2. 先调用painter.fillRect()绘制背景色,再执行原有的drawControl和drawText操作,确保背景色能正确显示在最底层。

内容的提问来源于stack exchange,提问作者RamiN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 15:18:26