如何在 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 中更改表格小部件中滚动条的颜色的主要内容,如果未能解决你的问题,请参考以下文章