获取小部件的背景颜色 - 真的
我在获取小部件的实际背景颜色时遇到了麻烦。特别是我在使用QTabWidget中的小部件时遇到问题。
这是在Windows7上进行的。普通的小部件有一些灰色的背景,而选项卡中的小部件通常是白色背景。
我尝试了:
def bgcolor(widget):
color = widget.palette().color(widget.backgroundRole()) # version 1
color = widget.palette().color(QtGui.QPalette.Background) # version 2
rgba = color.red(), color.green(), color.blue(), color.alpha()
return rgba
这基本上是我从Qt文档以及谷歌和StackOverflow上找到的信息。但这就是不管用。
我在选项卡小部件内外测试小部件,结果上面的函数对明显颜色不同的小部件返回了相同的颜色。也就是说,它总是返回灰色,即使选项卡内的小部件是纯白色的。
我是不是漏掉了什么?
补充说明:
我的问题是,当使用matplotlib时,matplotlib绘制的图形在QTabWidget中嵌入时,面颜色是“无”,但背景颜色却是错误的:灰色,尽管父小部件是白色的。
为了解决这个问题,我想获取小部件的背景颜色,并将其设置为图形的背景颜色。虽然这可能是matplotlib的问题,但我猜这是最快的解决办法。因为我发现无法获取正确的颜色,所以我变得有些执着了 :)
1 个回答
调色板返回的颜色是正确的。
你可能犯的错误是认为“背景”对所有小部件来说都是一样的。我们以一个没有修改的 QListWidget
为例。在一个传统的浅色桌面上,它可能看起来像是一个白色的视口,放在一个3D凹陷的面板里。但是如果你查询这个小部件的“背景”,你会看到这样的内容:
>>> widget = QtGui.QListWidget()
>>> widget.palette().color(QtGui.QPalette.Background).name()
'#edecec'
显然这并不是白色。所以对于这个小部件来说,Background
这个颜色角色是不对的。相反,Base
可能更合适:
>>> widget.palette().color(QtGui.QPalette.Base).name()
'#ffffff'
值得注意的是,关于颜色角色的文档指出,Background
和 Foreground
已经过时,推荐使用 Window
和 WindowText
。也许这是因为前者的术语现在被认为是误导性的。
更新:
在使用基于图像的样式的平台上,一些报告的调色板颜色可能与小部件的视觉外观不匹配。这个问题特别影响Windows和OSX,这可能解释了为什么你无法获取标签的明显背景颜色。这个问题在Qt常见问题解答中有说明,并提供了一些可能的解决方案(虽然 QProxyStyle
选项在PyQt5中支持,但在PyQt4中不支持)。