获取小部件的背景颜色 - 真的

3 投票
1 回答
5945 浏览
提问于 2025-04-18 02:21

我在获取小部件的实际背景颜色时遇到了麻烦。特别是我在使用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 个回答

5

调色板返回的颜色是正确的。

你可能犯的错误是认为“背景”对所有小部件来说都是一样的。我们以一个没有修改的 QListWidget 为例。在一个传统的浅色桌面上,它可能看起来像是一个白色的视口,放在一个3D凹陷的面板里。但是如果你查询这个小部件的“背景”,你会看到这样的内容:

>>> widget = QtGui.QListWidget()
>>> widget.palette().color(QtGui.QPalette.Background).name()
'#edecec'

显然这并不是白色。所以对于这个小部件来说,Background 这个颜色角色是不对的。相反,Base 可能更合适:

>>> widget.palette().color(QtGui.QPalette.Base).name()
'#ffffff'

值得注意的是,关于颜色角色的文档指出,BackgroundForeground 已经过时,推荐使用 WindowWindowText。也许这是因为前者的术语现在被认为是误导性的。

更新

在使用基于图像的样式的平台上,一些报告的调色板颜色可能与小部件的视觉外观不匹配。这个问题特别影响Windows和OSX,这可能解释了为什么你无法获取标签的明显背景颜色。这个问题在Qt常见问题解答中有说明,并提供了一些可能的解决方案(虽然 QProxyStyle 选项在PyQt5中支持,但在PyQt4中不支持)。

撰写回答