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

3

我在获取小部件的实际背景颜色方面遇到了问题。在我的特殊情况下,我在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文档、google和SO中得出的结论。但是它并不能正常工作。
我正在测试TabWidget内外的部件,并且上述函数对于明显颜色不同的部件返回相同的颜色。即使在选项卡中纯白色的部件,它也总是返回灰褐色。这是怎么回事?
编辑:
我的问题是使用matplotlib时,matplotlib在嵌入到QTabWidget中时,使用"none" facecolor绘制的图形具有错误的背景颜色:灰色,即使父部件为白色。为了解决这个问题,我想获取部件的背景颜色并将其设置为图形的背景颜色。虽然这可能是一个matplotlib问题,但我猜测这将是最快的解决方法。由于我注意到无法获取正确的颜色而变得坚持不懈 :)
1个回答

5
调色板返回了正确的颜色。
你可能犯了一个错误,就是认为“背景”对于所有小部件始终意味着相同的内容。让我们以未修改的为例。在传统的浅色主题桌面上,这将出现为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 FAQ中有记录,同时提供了一些可能的解决方案(尽管在PyQt5中支持QProxyStyle选项,但不支持PyQt4)。

“Base” 对于选项卡外的所有小部件都是错误的。我希望 'QWidget::backgroundRole()' 可以为每个小部件提供正确的颜色角色枚举...只有在回到办公室后才能检查... - sebastian
换句话说,我希望在我的 bgcolor 的第一版中,QWidget::backgroundRole() 可以解决这种歧义,理想情况下返回适当的 BaseWindow。但显然它并没有... 我试图找出小部件在其当前父级中的正确角色似乎不太可能是“正确”的解决方案。 - sebastian
@sebastian。如果您能解释一下您想要使用这些信息做什么,那会很有帮助——您的实际用例是什么? - ekhumoro
@sebastian。我已经更新了我的答案,加入了一些额外的信息,似乎可以确定你的问题所在。看起来值得尝试使用样式表,看看是否能够得到你想要的结果。 - ekhumoro
阅读了常见问题解答后:不能更改颜色并不一定意味着无法获得所需的颜色,对吧?!无论如何,我使用QPixmap::grabWidget成功获取了正确的颜色,但这似乎有些过度。因此,我回到了一个快速且不太通用的修复方法,并手动将matplotlib图形的颜色设置为“白色”... - sebastian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接