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