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

Posted

技术标签:

【中文标题】如何在 PyQt5 Python 中更改表格小部件中滚动条的颜色【英文标题】:How to change the color of scroll bar in table widget in PyQt5 Python 【发布时间】:2020-09-21 09:25:17 【问题描述】:

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

到目前为止,表格小部件的滚动条采用小部件的背景颜色,因此乍一看它是不可见的。是否可以更改其颜色以使其更明显。谢谢

【问题讨论】:

【参考方案1】:

滚动条的绘制方式完全取决于 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()))

请注意,这将为整个应用程序设置样式。如果您只想将此行为用于单个表格小部件,则需要为两个滚动条单独设置样式(因为样式不会传播到子级)。

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。请注意,在滚动条上设置样式表时,您不能为单个控件设置属性(例如仅用于按钮或句柄):您必须为每个控件提供样式表,否则滚动条将不会正确绘制,它可能会变得无法使用。

【讨论】:

以上是关于如何在 PyQt5 Python 中更改表格小部件中滚动条的颜色的主要内容,如果未能解决你的问题,请参考以下文章

如何在pyqt5 ui小部件代码中使用python脚本

如何在PyQt5中叠加小部件?

PyQt5 - 在表格小部件的列中创建一个检查项,即使行数与旋转框不同

在小部件 PyQt5 上设置布局后更改布局

在pyqt5中动态更改数据破折号

如何在不影响 Pyqt5 中的小部件的情况下将背景图像添加到主窗口