Qt 样式表是一种强大的机制,允许您自定义小部件的外观,这是在通过子类化QStyle已经可行的基础上的补充。Qt 样式表的概念、术语和语法在很大程度上受到 HTML级联样式表 (CSS)的启发,但适用于小部件的世界。
概述
样式表是文本规范,可以使用QApplication::setStyleSheet() 在整个应用程序上设置,或者使用QWidget::setStyleSheet() 在特定的小部件(及其子部件)上设置。如果在不同级别设置了多个样式表,Qt 会从所有已设置的样式表中派生有效的样式表。这称为层叠。
例如,以下样式表指定所有QLineEdit应使用黄色作为其背景颜色,并且所有QCheckBox应使用红色作为文本颜色:
QLineEdit { background: yellow }
QCheckBox { color: red }
对于这种定制,样式表比QPalette强大得多。例如,可能会很想将QPalette::Button角色设置为红色以获得红色的QPushButton。然而,这并不能保证在所有样式中都有效,因为样式作者受到不同平台的指南以及(在 Windows XP 和 macOS 上)本地主题引擎的限制。
样式表允许您进行各种仅使用QPalette难以或无法进行的自定义。如果您希望必填字段具有黄色背景、潜在破坏性的按钮具有红色文本,或者想要精美的复选框,样式表就是答案。
样式表应用于当前小部件样式之上,这意味着您的应用程序将尽可能看起来具有原生风格,但任何样式表约束都将被考虑在内。与调色板调整不同,样式表提供保证:如果您将QPushButton的背景颜色设置为红色,您可以确信该按钮在所有样式、所有平台上都将具有红色背景。此外,Qt 设计器提供样式表集成,使得在不同小部件样式中查看样式表的效果变得容易。
此外,样式表可用于为您的应用程序提供独特的外观和感觉,而无需对QStyle进行子类化。例如,您可以为单选按钮和复选框指定任意图像以使它们脱颖而出。使用此技术,您还可以实现通常需要对多个样式类进行子类化的较小自定义,例如指定样式提示。下面描绘的样式表示例定义了两个独特的样式表,您可以随意尝试和修改。
在 Windows XP 上运行的 Coffee 主题
在 Windows XP 上运行的 Pagefold 主题
在 Ubuntu Linux 上运行的 Coffee 主题
在 macOS 上运行的 Pagefold 主题
当样式表处于活动状态时,由QWidget::style()返回的QStyle是一个包装的“样式表”样式,而不是特定于平台的样式。该包装样式确保任何活动的样式表都得到遵循,否则将绘图操作转发到基础的、特定于平台的样式(例如,在 Windows XP 上的 QWindowsXPStyle)。