【问题标题】:How to keep Windows Aero theme after setting of background color of button in Qt?在 Qt 中设置按钮的背景颜色后如何保持 Windows Aero 主题?
【发布时间】:2015-11-12 07:30:58
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 不幸的是,Windows doesn't natively support that,所以无论你想出什么解决方案都必须是你自己的。您可以做的最好的事情是在图像/像素图上绘制按钮,然后按照您希望的方式对其进行着色。

标签: windows qt background-color aero dwm


【解决方案1】:

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

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

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

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

没有标准的方法。如果您想在没有此类不可预测问题的情况下使用样式表 - 您需要使用“Fusion”样式而不是任何本机样式。 “融合”风格是 QSS 定制的良好基础。 See documentation

其他机会 - 是使用 QtQuick 而不是小部件。

【讨论】:

  • 感谢您提供这些想法和链接!不幸的是,Windows 中的“Fusion”风格和 Aero 主题是不同的。您能否澄清QtQuick 在这里可以提供什么帮助?
  • QtQuick 是为现代跨平台 GUI 开发而创建的 Qt 框架的新部分。您可以阅读 Qt 文档和示例。
【解决方案2】:

我看到您正在使用样式表来修改按钮的背景颜色。不久前我也遇到过同样的问题。一旦应用样式表,按钮就会失去第三种效果,并且您也看不到悬停效果。 我的看法是放弃使用样式表并使用QPalette 设置颜色。例如,

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

【讨论】:

  • 感谢您提出这个想法!不幸的是,Aero 风格比setPalette()“更强大”。我之前也检查过这个想法:在经典主题中,我们有蓝色按钮,但在 Aero 主题中,我们只能看到具有默认背景颜色的按钮。看起来,桌面窗口管理器只是忽略了小部件的调色板。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-15
  • 1970-01-01
  • 2019-06-07
  • 1970-01-01
  • 2012-07-31
  • 1970-01-01
相关资源
最近更新 更多