本页内容

Qt 样式表

Qt样式表允许您通过文本规则自定义控件的外观,这在继承QStyle 类的基础上提供了更多可能性。Qt样式表的概念、术语和语法深受HTML层叠样式表(CSS)的启发,但已针对控件领域进行了适配。

样式表是一种用于原型设计和进行小范围局部调整的工具;若要实现应用程序的正式外观,请实现QStyle 类或使用StyleKit。文章《Qt Widgets 的样式设计方法》阐述了样式表的代价,并对比了各种方法。

主题:

注意:如果 在同一控件上同时使用了Qt样式表和用于设置控件外观的函数(如QWidget::setFont()或QTreeWidgetItem::setBackground()),当设置发生冲突时,样式表将具有优先级。

概述

样式表是文本规范,可通过QApplication::setStyleSheet() 应用于整个应用程序,或通过QWidget::setStyleSheet() 应用于特定控件(及其子控件)。如果在不同层级设置了多个样式表,Qt 会从所有已设置的样式表中推导出实际生效的样式表。这被称为级联。

请在显示第一个窗口之前,一次性设置应用程序样式表。在运行时更改样式表可能会导致结果不一致,即新样式表仅会覆盖旧样式表的部分内容。请勿使用此函数在运行时切换主题。

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

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

对于此类自定义操作,样式表比QPalette 功能强大得多。例如,您可能会想将QPushButton 的QPalette::Button 角色设置为红色,以获得一个红色的按钮。但是,这并不保证对所有样式都有效,因为样式作者受不同平台指南的限制,并且(在 Windows 和 macOS 上)还受原生主题引擎的限制。

样式表允许您进行各种仅靠QPalette 难以实现甚至无法实现的自定义操作。如果您希望必填字段显示黄色背景、可能导致数据丢失的按钮显示红色文本,或者使用花哨的复选框,样式表就是最佳解决方案。

样式表是叠加在当前widget style 之上的,这意味着您的应用程序将尽可能呈现原生外观,同时也会考虑样式表设定的任何限制。与调整调色板不同,样式表能提供确定性:如果您将QPushButton 的背景色设置为红色,就可以确信该按钮在所有样式和所有平台上都会显示红色背景。 此外,Qt Widgets Designer 提供了样式表集成功能,使您能够轻松查看样式表在不同widget styles 中的效果。

样式表还可以让原型具有独特的外观,而无需继承QStyle ——例如,通过为单选按钮和复选框指定图片。

当样式表处于活动状态时,QWidget::style() 返回的QStyle 是一个包装器“样式表”样式,而不是特定于平台的样式。 该包装样式确保任何有效的样式表均得到尊重,并将其余绘制操作转发给底层的、特定于平台的样式(例如,Windows 上的windows11 样式,或 macOS 上的macos 样式;参见QStyleFactory )。

安全注意事项

样式表文本由 Qt 解析,并可引用外部资源:url() 函数可指向任何本地文件或 Qt 资源,Qt 随后会加载并渲染这些资源,例如作为背景、边框或图标图像。 如果应用程序从无法完全控制的数据(例如运行时可选的主题文件、通过-stylesheet 命令行选项提供的路径,或来自插件的内容)构建全部或部分样式表,则应将该内容视为来自不可信来源的任何其他文件路径一样进行处理。 恶意样式表可能会导致 Qt 读取并显示应用程序进程有权访问的任意本地文件的内容。

硬编码在应用程序中或嵌入到编译后的 Qt 资源文件中的样式表不受此问题影响,因为其内容完全由应用程序本身控制。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.