如何在Qt中设置按钮的背景颜色后保留Windows Aero主题?

时间:2015-08-19 06:31:08

标签: windows qt background-color aero dwm

有没有办法改变小部件的背景颜色而不失去它的风格?我的问题在具有Aero主题的Windows 7 / Vista和Windows 8上也是可重现的。您可以在Qt Designer中看到它的外观:

Background colour is the only difference between top and bottom buttons

这里我们有四个按钮:两个顶级小部件看起来都很好(与该程序的所有其他小部件一样),但两个底部小部件看起来都很旧。这种旧式的唯一原因是设置这些按钮的背景颜色(据我所知,桌面窗口管理器将样式重置为旧的,如果小部件不是标准的)。

那么,有没有办法强制桌面窗口管理器绘制没有标准背景颜色的按钮? (Microsoft Office可以这样做,但我不确定它是标准功能)

你能推荐用现代(Aero主题)取代按钮标准图的Qt扩展吗?或者你可能知道更标准的方法吗?

我发现只有一种方法可以在不失去风格的情况下改变颜色:将部分透明的小部件放在按钮上方(并使鼠标点击透明)。你可以在这里看到结果(我的框架比必要的大 - 它用于演示;我还需要色彩校正来补偿透明度,但这并不重要):

Workaround (semi-transparent frame is above buttons)

它有效,但我不喜欢这个“解决方案”。你有更好的主意吗?

2 个答案:

答案 0 :(得分:2)

我看到您正在使用样式表来修改按钮的背景颜色。我刚才面临同样的问题。一旦你应用了样式表,按钮就会失去第3个效果,你也看不到悬停效果。 我对它的看法是丢弃使用样式表并使用QPalette来设置颜色。例如,

QPalette bluePalette(button->palette()); // original palette
bluePalette.setColor(QPalette::Button, QColor(Qt::blue)); //colour you want
button->setPalette(bluePalette);

答案 1 :(得分:1)

  

那么,有没有办法强制桌面窗口管理器绘制按钮   没有标准的背景颜色? (Microsoft Office可以做到,但我   我不确定它是标准功能)

您可以编写自己的QProxyStyle并使用WinAPI函数绘制具有航空风格和自定义背景颜色的按钮。您可以查看Qt资源,了解它是如何为航空服务完成的。但这是一项非常复杂的任务。

样式表不适用于任何动画(例如航空中的悬停动画)。

  

你能推荐替换标准图纸的Qt扩展吗?   按钮由现代(航空主题)?或者你可能知道更多的标准方式   做到了吗?

没有标准的方法。如果你想使用样式表没有这些不可预测的问题 - 你需要使用" Fusion"样式而不是任何原生样式。 "融合"风格是QSS定制的良好基础。 See documentation

其他机会 - 使用QtQuick代替小部件。