如何在 PyQt5 Python table 小部件中更改滚动条的颜色

How to change the color of scroll bar in table widget in PyQt5 Python

我正在设计 UI,其中我有一个 table widget,我在其中显示一些数据。如下所示:

截至目前,table 小部件的滚动条采用小部件的背景色,因此乍看之下不可见。是否可以更改其颜色以使其更明显。谢谢

如何绘制滚动条完全取决于QStyle。

一种可能是设置滚动条的调色板,使用正确的 ColorRole,但不幸的是,并非所有样式都以相同的方式绘制小部件。有些使用 QPalette.Button 角色,有些则完全忽略小部件调色板。

虽然可以使用 QProxyStyle,但某些样式也会忽略 CE_ScrollBarSlider 控件,因为它们会完全自行绘制整个滚动条。

不过,对于默认的“windows”样式,代理样式通常有效:

class ProxyStyle(QtWidgets.QProxyStyle):
    def drawControl(self, ctl, opt, qp, widget=None):
        if ctl == self.CE_ScrollBarSlider:
            opt = opt.__class__(opt)
            opt.palette.setColor(opt.palette.Button, QtCore.Qt.green)
        super().drawControl(ctl, opt, qp, widget)

# ...

app = QtWidgets.QApplication(sys.argv)
app.setStyle(ProxyStyle(app.style()))

请注意,这将为 整个 应用程序设置样式。如果您只想对单个 tablewidget 使用此行为,则需要为 both 滚动条分别设置样式(因为样式不会传播给子项)。

class TableWidget(QtWidgets.QTableWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        style = ProxyStyle(self.style().objectName())
        self.horizontalScrollBar().setStyle(style)
        self.verticalScrollBar().setStyle(style)

如您所见,在上面的示例中我使用了不同的构造函数。那是因为使用 ProxyStyle(QStyle) 会导致代理 覆盖 构造函数中的样式(因此您最终会用代理样式绘制所有滚动条)。使用 self.style().objectName() 确保将创建新样式,并且该样式将仅用于代理,因此用于应用它的小部件。

最后,如果您需要提供跨平台(和跨样式)兼容性,唯一可能的解决方案是使用样式表,对此您应该阅读 customizing QScrollBar。请注意,在滚动条上设置样式表时,您不能为单个控件设置属性(例如只能为按钮或手柄设置属性):您必须为每个控件提供样式表,否则滚动条将获胜'绘制不正确,可能会变得无法使用。