Qt样式表#

如何使用样式表来自定义小部件的外观。

Qt样式表是一种强大的机制,它允许您自定义小部件的外观,而不仅限于使用QStyle子类可以实现的自定义。Qt样式表的的概念、术语和语法很大程度上受到HTML级联样式表(CSS)的启发,但针对小部件世界做了调整。

主题

注意

如果Qt样式表与设置小部件外观的函数(如setFont()setBackground())存在于同一小部件上时,样式表将优先生效,如果设置冲突。

概述#

样式表是文本指定,可以使用setStyleSheet()在整个应用程序中设置,或在特定小部件(及其子项)中设置,使用setStyleSheet()。如果设置了多个样式表,并且在不同的级别,Qt将使用所有设置的样式表来派生出有效的样式表。这被称为级联。

例如,以下样式表指定所有QLineEdit应使用黄色作为背景颜色,所有QCheckBox应使用红色作为文字颜色

QLineEdit { background: yellow }
QCheckBox { color: red }

对于这种类型的自定义,样式表比QPalette要强大得多。例如,可能会很诱人来设置QPushButton的QPalette::Button角色为红色,以获得一个红色的按钮。但这对所有样式并不一定保证生效,因为样式创作者受到不同平台指南的限制,以及在Windows和macOS上的本地主题引擎限制。

样式表允许您执行所有类型的大量自定义,这是仅使用QPalette难以或无法实现的。如果您为必需字段想要黄色背景,为潜在破坏性按钮想要红色文字,或想要花哨的复选框,样式表就是答案。

样式表应用于当前的 widget style 之上,这意味着您的应用程序将尽可能接近原生的外观,但会将任何样式表约束考虑在内。与调色板操作不同,样式表提供了保证:如果您将 QPushButton 的背景颜色设置为红色,您可以确信该按钮将在所有样式和各种平台上都有红色背景。此外,Qt Designer 提供了样式表的集成,这使得您可以轻松地查看不同 widget styles 中样式表的效果。

此外,样式表可用于为您的应用程序提供独特的视觉和触觉效果,而无需对 QStyle 进行子类化。例如,您可以为单选按钮和复选框指定任意图像,以使其突出。使用此技术,您还可以实现通常需要子类化多个样式类的小型定制,例如指定 style hint

当样式表处于活动状态时,由 style() 返回的 QStyle 是一个“样式表”风格的包装器,不是平台特定的风格。包装器风格确保会尊重任何活动样式表,否则会将绘图操作转发到底层平台特定风格(例如,Windows 上的 QWindowsVistaStyle)。

自 Qt 4.5 以来,Qt 样式表完全支持 macOS。