QProgressBar :在保持操作系统样式的同时更改颜色

QProgressBar : Change color while keeping OS style

本文关键字:颜色 样式 操作系统 QProgressBar      更新时间:2023-10-16

我知道Qt默认使用操作系统样式来装饰QProgressBar

我想知道是否有办法在保持操作系统样式的同时更改QProgressBar的颜色。

我尝试了几种方法,如下所示。

更改调色板

QPalette palette = myProgressBar->palette();
palette.setBrush(QPalette::Highlight, someColor); // setColor() did the same
myProgressBar->setPalette(palette);

直接更改样式

QPalette palette = myProgressBar->palette();
palette.setBrush(QPalette::Highlight, someColor); // setColor() did the same
myProgressBar->style()->polish(palette);

但这两种方法都被完全忽略了,没有任何改变。

我发现更改QProgressBar颜色的唯一方法是通过setStyleSheet()设置样式表。问题是它同时忽略了操作系统样式。

我认为可以在样式表中大致复制操作系统样式,但我不知道是否可以直接应用操作系统样式而只更改调色板。

我将不胜感激任何有用的答案。


编辑:操作系统未修复。我正在尝试使其在Windows下工作,但该应用程序可能/将在另一个操作系统(某些Linux发行版)下运行。

这取决于您使用的样式。一般来说,Qt特定的主题(如融合)可以通过更改调色板轻松定制(请注意,不同的样式可能使用不同的调色板角色)。

但是,对于操作系统特定的样式(如QWindowsVistaStyle),您根本无法做到这一点。 原因是样式实现忽略了调色板并使用操作系统主题中的颜色。

例如,如果您查看QWindowsXPStyle的实现,您会发现对GetThemeColor()的调用,该调用从操作系统返回颜色。

这些特定于操作系统的样式也无法正确使用样式表,这就是为什么如果您使用样式表,小部件将回退到默认样式。

我相信您唯一的解决方案是使用QProxyStyle,但您可能需要重写代码以绘制要自定义的小部件的一部分。