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?