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

3

我知道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发行版)。

@hyde 我没有提供完整的MCVE,以避免添加不必要的噪音并仅关注问题。就像你说的,用Qt显示单个小部件不会有害。此外,我的问题不限于C++(它更多涉及于Qt,不论所使用的编程语言)。 - Fareanor
1个回答

0

这取决于你使用的风格。一般来说,Qt特定的主题(如融合)可以通过简单地更改调色板进行轻松自定义(请注意,不同的样式可能使用不同的调色板角色)。

然而,对于特定于操作系统的样式(如QWindowsVistaStyle),你根本无法这样做。原因是样式实现忽略了调色板并使用来自操作系统主题的颜色。

例如,如果你查看QWindowsXPStyle的实现,你会发现调用GetThemeColor(),它返回来自操作系统的颜色。

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

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


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