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

seb*_*ian 3 python qt pyqt matplotlib

我无法获取小部件的实际背景颜色。在我的特殊情况下,我在使用 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
Run Code Online (Sandbox Code Playgroud)

这几乎是我可以从 Qt 文档以及 google 和 SO 提供的内容中找出的内容。但是,这根本行不通。

我正在测试 TabWidget 内部和外部的小部件,上面的函数为明显不同颜色的小部件返回相同的颜色。也就是说,它总是返回灰色,即使对于选项卡中的纯白色小部件也是如此。

我在这里错过了什么吗?

编辑:

我的问题是,当使用 matplotlib 时,当嵌入到 QTabWidget 中时,matplotlib 会绘制带有“无”面部颜色的图形,并且背景颜色错误:灰色,即使父窗口小部件是白色的。

为了解决这个问题,我想获取小部件的背景颜色并将其设置为图形的背景颜色。虽然这可能是 matplotlib 问题,但我猜这将是最快的解决方法。当我发现我无法获得正确的颜色时,我变得坚持:)

ekh*_*oro 5

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

您可能犯的错误是您假设“背景”对于所有小部件始终意味着相同的事情。我们以未修改的QListWidget为例。在采用传统浅色方案的桌面上,这可能会显示为 3D 凹陷面板内的白色视口。但是,如果您查询此小部件的“背景”,您将看到如下内容:

>>> widget = QtGui.QListWidget()
>>> widget.palette().color(QtGui.QPalette.Background).name()
'#edecec'
Run Code Online (Sandbox Code Playgroud)

这显然不是白色的。Background查询此小部件的颜色角色也是错误的。相反,它看起来Base可能更合适:

>>> widget.palette().color(QtGui.QPalette.Base).name()
'#ffffff'
Run Code Online (Sandbox Code Playgroud)

值得注意的是,颜色角色的文档指出BackgroundForeground是过时的值,建议使用Window和来代替。WindowText也许这是因为以前的术语现在被认为具有误导性。

更新

在使用基于像素图的样式的平台上,某些报告的调色板颜色将与小部件的视觉外观不匹配。此问题特别影响 Windows 和 OSX,因此可以解释为什么您无法获取选项卡的明显背景颜色。这个问题记录在Qt FAQ中,其中也提供了一些可能的解决方案(尽管QProxyStylePyQt5 支持该选项,但 PyQt4 不支持)。