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

时间:2019-06-12 09:14:47

标签: c++ qt

我知道Qt默认使用OS风格装饰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下运行,但该应用程序可能/将在其他OS(某些Linux发行版)下运行。

1 个答案:

答案 0 :(得分:0)

这取决于您使用的样式。通常,只需更改调色板即可轻松定制Qt特定主题(如融合)(请注意,不同样式可能使用不同的调色板角色)。

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

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

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

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