QProgressBar : 在保持 OS 风格的同时改变颜色

Posted

技术标签:

【中文标题】QProgressBar : 在保持 OS 风格的同时改变颜色【英文标题】:QProgressBar : Change color while keeping OS style 【发布时间】:2019-06-12 09:14:47 【问题描述】:

我知道 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() 设置样式表。问题是它同时忽略了操作系统样式。

我认为可以大约在样式表中复制 OS 样式,但我不知道是否可以直接应用 OS 样式并且只更改调色板。

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


编辑:操作系统不固定。我试图让它在 Windows 下运行,但该应用程序可能/将在另一个操作系统(某些 Linux 发行版)下运行。

【问题讨论】:

@hyde 我没有提供完整的 MCVE 以不添加不必要的噪音并只关注问题。正如您所说,使用 Qt 显示单个小部件并没有什么坏处。此外,我的问题不仅限于 C++(更多的是关于 Qt,无论是哪种语言)。 【参考方案1】:

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

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

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

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

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

【讨论】:

以上是关于QProgressBar : 在保持 OS 风格的同时改变颜色的主要内容,如果未能解决你的问题,请参考以下文章

当 QProgressBar 存在时如何居中对齐 QPushButton?

在 QProgressBar 中显示文本

Python:QtGui.QProgressBar 颜色

从多个 QThread 更新 QProgressBar

Qt C++ - 在 QSplashScreen 内对齐 QProgressBar

QProgressBar 忙不工作