[!tips] 提示
QSS 称为 Qt Style Sheets (Qt 样式表) = CSS

一 添加样式表

需要添加到资源文件 *.qrc 中才能使用

  1. 添加资源文件 项目 -> 添加已有文件 -> global.qss 文件
  2. res. Qrc 文件中添加 QSS 资源
<RCC>
    <qresource logo="/">
        <file>../images/logo.ico</file>
        <file>../themes/global.qss</file>
    </qresource>
</RCC>

二 加载样式表

/// 初始化样式表
QFile file(":/themes/default.qss");
file.open(QFile::ReadOnly | QFile::Text);
QTextStream textStream(&file);
QString qss = textStream.readAll();
app.setStyleSheet(qss);
file.close();

三 基本语法

选择器 {
    属性: 值
}
3.1 选择器
/* 多选择器 */
QCheckBox, QComboBox, QSpinBox {
    color: rgb(155,155,155);
    background-color: white;
    font: bold;
}
选择器举例说明
 | 通用选择器  | `*`                         | 所有 Qt 的 `widget`,即不声明选择器时,属性作用于所有组件            |

| 类型选择器 | QPushButton | 作用于 QPushButton 及其子类的实例 |
| 属性选择器 | QPushButton[flat=“false”] | 作用于非平面(flat=“false”)的 QPushButton 实例 |
| 类选择器 | .QPushButton | 作用于 QPushButton 的实例,但不匹配其子类的实例。(前面加了个’.’) |
| ID 选择器 | QPushButton #okButton | 作用于对象名称为 okButton 的所有 QPushButton 实例 |
| 后代选择器 | QDialog QPushButton | 匹配作为 QDialog 的子体(子级、孙级等)的所有 QPushButton 实例 |
| 子选择器 | QDialog > QPushButton | 匹配作为 QDialog 的直接子级的所有 QPushButton 实例 |
| 子控制 | QComboBox:: drop-down | 作用于 QComboBox 的子控件 drop-down 下拉箭头 |

3.2 属性: 伪状态(PSEUDO-STATES)

用户在操作时,可以根据不同的交互状态展示不同的用户样式,界面能够识别用户操作,不需要代码控制即可响应不同状态下的样式;

  • 示例程序为一个按钮在默认、悬浮、按下和禁用时的样式:

    /* 默认 */
    QPushButton {
      border: 1px solid #555;
      padding: 4px;
      min-width: 65px;
      min-height: 12px;
    }
    
    /* 悬浮 */
    QPushButton:hover {
      background-color: #999;
    }
    
    /* 按下 */
    QPushButton:pressed {
      background-color: #333;
      border-color: #555;
      color: #AAA;
    }
    
    /* 禁用 */
    QPushButton:disabled {
      color: #333333;
    }
    
伪状态说明
:active此状态在 widget 驻留在活动窗口中时设置
adjoins-item此状态在 QTreeView:: branch 与项相邻时设置
:alternateQAbstractItemView:: ternatingRowColors () 设置为 true 时,将为绘制 QAbstractItemView 的行时的每隔一行设置此状态
:bottom该项目位于底部。例如,标签位于底部的 QTabBar
:checked该项目已选中。例如,QAbstractButton 的选中状态
:closable这些项目可以关闭。例如,QDockWidget 打开了 QDockWidget:: DockWidgetClosable 功能
:default该项目为默认值。例如,QMenu 中的默认 QPushButton 或默认操作
:disabled该项目已禁用
:editableQComboBox 是可编辑的
:edit-focus该项具有编辑焦点(请参见 QStyle::State_HasEditFocus)此状态仅适用于 Qt 扩展应用程序
:enabled该项目已启用
:exclusive该项目是独占项目组的一部分。例如,独占 QActionGroup 中的菜单项
:first该项目是(列表中的)第一个项目。例如,QTabBar 中的第一个选项卡
:flat这件物品是平面的。例如,平面 QPushButton
:floatable这些项目可以浮动。例如,QDockWidge t 打开了 QDockWidget:: DockWidgetFloatable 功能
:focus该项具有输入焦点
:has-children该项目具有子项。例如,QTreeView 中具有子项的项
:has-siblings该项目有同级。例如,QTreeView 中的同级项
:horizontal该项目具有水平方向
:hover鼠标悬停在该项目上
:indeterminate该项具有不确定状态。例如,部分选中 QCheckBoxQRadioButton
:last该项是(列表中的)最后一项。例如,QTabBar 中的最后一个选项卡
:left该项目位于左侧。例如,选项卡位于左侧的 QTabBar
:maximized该项目将最大化。例如,最大化的 QMdiSubWindow
:middle项目在中间(在列表中)。例如,QTabBar 中不在开头或结尾的制表符
:minimized该项目被最小化。例如,最小化的 QMdiSubWindow
:movable物品可以四处移动。例如,QDockWidget 打开了 QDockWidget:: DockWidgetMoovable 功能
:no-frame该项目没有框架。例如,无框架的 QSpinBoxQLineEdit
:non-exclusive该项是非独占项组的一部分。例如,非独占 QActionGroup 中的菜单项
:off对于可以切换的项目,这适用于处于“关闭”状态的项目
:on对于可以切换的项目,这适用于处于“打开”状态的 widget
:only-one该项目是(列表中的)唯一项目。例如,QTabBar 中的一个单独的选项卡
:open该项目处于打开状态。例如,QTreeView 中的展开项,或具有打开菜单的 QComboBoxQPushButton
:next-selected选择下一项(在列表中)。例如,QTabBar 的选定选项卡紧挨着该项
:pressed正在使用鼠标按下该项
:previous-selected选择上一项(在列表中)。例如,QTabBar 中选定选项卡旁边的选项卡
:read-only该项目标记为只读或不可编辑。例如,只读 QLineEdit 或不可编辑的 QComboBox
:right该项目位于右侧。例如,选项卡位于右侧的 QTabBar
:selected该项目即被选中。例如,QTabBar 中的选定选项卡或 QMenu 中的选定项目
:top该项目位于顶部。例如,选项卡位于顶部的 QTabBar
:unchecked该项目处于取消选中状态
:vertical该项目具有垂直方向
:window widget是窗口(即顶层小部件)
3.3 子控件

要设置复杂的 widget 样式,需要访问 widget 的子控件,如 QComboBox 的下拉按钮或 QSpinBox 的上下箭头。选择器可以包含子控件,从而可以将规则的应用限制到特定的 widget 子控件;

子控件说明
::add-lineQScrollBar 添加行的按钮
::add-pageQScrollBar 的控制柄(滑块)和添加线之间的区域
::branchQTreeView 的分支指示符
::chunkQProgressBar 的进度块
::close-buttonQDockWidgetQTabBar 选项卡的关闭按钮
::cornerQAbstractScrollArea 中两个滚动条之间的角
::down-arrowQComboBoxQHeaderView(排序指示符)、QScrollBarQSpinBox 的向下箭头
::down-buttonQScrollBarQSpinBox 的向下按钮
::drop-downQComboBox 的下拉按钮
::float-buttonQDockWidget 的浮动按钮
::grooveQSlider 的槽
::indicatorQAbstractItemViewQCheckBoxQRadioButton、可点击的 QMenu 项或可点击的 QGroupBox 的指示器
::handleQScrollBarQSplitterQSlider 的手柄(滑块)
::iconQAbstractItemViewQMenu 的图标
::itemQAbstractItemViewQMenuBarQMenuQStatusBar 的项
::left-arrowQScrollBar 的左箭头
::left-cornerQTabWidget 的左角。例如,此控件可用于控制 QTabWidget 中的左角小部件的位置
::menu-arrow带有菜单的 QToolButton 的箭头
::menu-buttonQToolButton 的菜单按钮
::menu-indicatorQPushButton 的菜单指示器
::right-arrow带有菜单的 QToolButton 的箭头
::menu-buttonQToolButton 的菜单按钮
::menu-indicatorQPushButton 的菜单指示器
::right-arrowQMenuQScrollBar 的右箭头
::paneQTabWidget 的窗格(框架)
::right-cornerQTabWidget 的右角。例如,此控件可用于控制 QTabWidget 中右角小部件的位置
::scrollerQMenuQTabBar 的滚动条
::sectionQHeaderView 的部件
::separatorQMenuQMainWindow 中的分隔符
::sub-lineQScrollBar 减去行的按钮
::sub-pageQScrollBar 的控制柄(滑块)和子行之间的区域
::tabQTabarQToolBox 的选项卡
::tab-barQTabWidget 的选项卡栏。这个子控件的存在只是为了控制 QTabWidgetQTabBar 的位置
::tearQTabBar 的撕裂指示器
:tearoffQMenu 的撕裂指示器
::textQAbstractItemView 的文本
::titleQGroupBoxQDockWidget 的标题
::up-arrowQHeaderView(排序指示符)、QScrollBarQSpinBox 的向上箭头
::up-buttonQSpinBox 的向上按钮