声明
本文是对Qt的Style Sheets官方文档的翻译,链接是Qt Style Sheets | Qt Widgets 6.7.1。
前言
Qt样式表是一种强大的机制,它允许您自定义控件的外观,此外通过子类化QStyle实现也可以自定义控件的外观。Qt样式表的概念、术语和语法很大程度上受到HTML层叠样式表(CSS)的启发,但适应了控件的世界。
注意:如果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难以或不可能执行的定制。如果您希望强制性字段的背景为黄色,可能具有破坏性的按钮或花哨的复选框的文本为红色,样式表就是答案。
样式表应用于当前控件样式之上,这意味着您的应用程序看起来尽可能原生,但将考虑到任何样式表约束。与调色板不同,样式表提供了保证:如果将QPushButton的背景色设置为红色,则可以确保该按钮在所有平台上的所有样式中都具有红色背景。此外,Qt Designer还提供了样式表集成,使得在不同的控件样式中查看样式表的效果变得很容易。
此外,可以使用样式表为应用程序提供独特的外观,而不必子类化QStyle。例如,您可以为单选按钮和复选框指定任意图像,以使它们脱颖而出。使用这种技术,您还可以实现通常需要子类化几个样式类的小型定制,例如指定样式提示。
当样式表起作用时,由QWidget::style()返回的QStyle是包装器“样式表”样式,而不是特定于平台的样式。包装器样式确保任何活动样式表都受到尊重,否则将绘图操作转发到底层的,特定于平台的样式(例如,Windows上的QWindowsVistaStyle)。
从Qt 4.5开始,Qt样式表完全支持macOS。