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

5

有没有办法在不失去小部件样式的情况下更改其背景颜色?我的问题可以在 Windows 7/Vista 上的 Aero 主题和 Windows 8 上重现。您可以在 Qt Designer 中看到它的外观:

Background colour is the only difference between top and bottom buttons

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

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

您能推荐一个Qt扩展,用现代(Aero主题)替换按钮的标准绘制吗?或者您知道更标准的方法吗?

我只找到了一种在不失去样式的情况下更改颜色的方法:将部分透明的小部件放在按钮上方(并使其对鼠标点击透明)。 您可以在此处查看结果(我的边框比必要的大-这是为了演示;还需要颜色校正以补偿透明度,但这并不重要):

Workaround (semi-transparent frame is above buttons)

它可以运行,但我不喜欢这个“解决方案”。你有更好的想法吗?

1
不幸的是,Windows 不支持该功能,因此你必须自己想出解决方案。最好的方法是在图像/位图上绘制按钮,然后以所需的方式对其进行着色。 - Kuba hasn't forgotten Monica
2个回答

2

我看到您正在使用样式表来修改按钮的背景颜色。我曾经遇到过同样的问题。一旦应用了样式表,按钮就失去了第三个效果,而且您也看不到悬停效果。 我的解决方法是放弃使用样式表,而是使用QPalette来设置颜色。例如:

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

1
谢谢您提供这个想法!不幸的是,Aero风格比setPalette()更强大。我之前也尝试过这个想法:在经典主题中,我们有蓝色按钮,但在Aero主题中,我们只能看到默认背景颜色的按钮。看起来桌面窗口管理器忽略了小部件的调色板。 - Ilya

1
所以,有没有办法强制桌面窗口管理器绘制带有非标准背景颜色的按钮?(Microsoft Office可以做到,但我不确定它是否是标准功能)
您可以编写自己的QProxyStyle并使用WinAPI函数以aero样式和自定义背景颜色绘制按钮。您可以查看Qt源代码,了解如何为aero完成此操作。但这是非常复杂的任务。
样式表不适用于任何动画(例如aero中的悬停动画)。
你能推荐一个Qt扩展来替换现代(Aero主题)的标准按钮绘制吗?或者您知道更标准的方法吗?
没有标准方法。如果要在不出现此类不可预测问题的情况下使用样式表,则需要使用“Fusion”样式而不是任何本机样式。“Fusion”样式是QSS自定义的良好基础。请参阅文档 另一种机会是使用QtQuick而不是小部件。

谢谢您提供这些想法和链接!不幸的是,“Fusion”风格和Windows中的Aero主题是不同的。您能否请澄清一下 QtQuick 在这里如何帮助? - Ilya
QtQuick是Qt框架的一个新部分,专门为现代跨平台GUI开发而创建。您可以阅读Qt文档和示例。 - Dmitry Sazonov

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