[!tips] 提示
QSS 称为 Qt Style Sheets (Qt 样式表) = CSS
一 添加样式表
需要添加到资源文件 *.qrc
中才能使用
- 添加资源文件
项目
->添加已有文件
->global.qss
文件 - 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 与项相邻时设置 |
:alternate | 当 QAbstractItemView:: ternatingRowColors () 设置为 true 时,将为绘制 QAbstractItemView 的行时的每隔一行设置此状态 |
:bottom | 该项目位于底部。例如,标签位于底部的 QTabBar |
:checked | 该项目已选中。例如,QAbstractButton 的选中状态 |
:closable | 这些项目可以关闭。例如,QDockWidget 打开了 QDockWidget:: DockWidgetClosable 功能 |
:default | 该项目为默认值。例如,QMenu 中的默认 QPushButton 或默认操作 |
:disabled | 该项目已禁用 |
:editable | QComboBox 是可编辑的 |
: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 | 该项具有不确定状态。例如,部分选中 QCheckBox 或 QRadioButton |
:last | 该项是(列表中的)最后一项。例如,QTabBar 中的最后一个选项卡 |
:left | 该项目位于左侧。例如,选项卡位于左侧的 QTabBar |
:maximized | 该项目将最大化。例如,最大化的 QMdiSubWindow |
:middle | 项目在中间(在列表中)。例如,QTabBar 中不在开头或结尾的制表符 |
:minimized | 该项目被最小化。例如,最小化的 QMdiSubWindow |
:movable | 物品可以四处移动。例如,QDockWidget 打开了 QDockWidget:: DockWidgetMoovable 功能 |
:no-frame | 该项目没有框架。例如,无框架的 QSpinBox 或 QLineEdit |
:non-exclusive | 该项是非独占项组的一部分。例如,非独占 QActionGroup 中的菜单项 |
:off | 对于可以切换的项目,这适用于处于“关闭”状态的项目 |
:on | 对于可以切换的项目,这适用于处于“打开”状态的 widget |
:only-one | 该项目是(列表中的)唯一项目。例如,QTabBar 中的一个单独的选项卡 |
:open | 该项目处于打开状态。例如,QTreeView 中的展开项,或具有打开菜单的 QComboBox 或 QPushButton |
: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-line | QScrollBar 添加行的按钮 |
::add-page | QScrollBar 的控制柄(滑块)和添加线之间的区域 |
::branch | QTreeView 的分支指示符 |
::chunk | QProgressBar 的进度块 |
::close-button | QDockWidget 或 QTabBar 选项卡的关闭按钮 |
::corner | 在 QAbstractScrollArea 中两个滚动条之间的角 |
::down-arrow | QComboBox 、QHeaderView (排序指示符)、QScrollBar 或 QSpinBox 的向下箭头 |
::down-button | QScrollBar 或 QSpinBox 的向下按钮 |
::drop-down | QComboBox 的下拉按钮 |
::float-button | QDockWidget 的浮动按钮 |
::groove | QSlider 的槽 |
::indicator | QAbstractItemView 、QCheckBox 、QRadioButton 、可点击的 QMenu 项或可点击的 QGroupBox 的指示器 |
::handle | QScrollBar 、QSplitter 或 QSlider 的手柄(滑块) |
::icon | QAbstractItemView 或 QMenu 的图标 |
::item | QAbstractItemView 、QMenuBar 、QMenu 或 QStatusBar 的项 |
::left-arrow | QScrollBar 的左箭头 |
::left-corner | QTabWidget 的左角。例如,此控件可用于控制 QTabWidget 中的左角小部件的位置 |
::menu-arrow | 带有菜单的 QToolButton 的箭头 |
::menu-button | QToolButton 的菜单按钮 |
::menu-indicator | QPushButton 的菜单指示器 |
::right-arrow | 带有菜单的 QToolButton 的箭头 |
::menu-button | QToolButton 的菜单按钮 |
::menu-indicator | QPushButton 的菜单指示器 |
::right-arrow | QMenu 或 QScrollBar 的右箭头 |
::pane | QTabWidget 的窗格(框架) |
::right-corner | QTabWidget 的右角。例如,此控件可用于控制 QTabWidget 中右角小部件的位置 |
::scroller | QMenu 或 QTabBar 的滚动条 |
::section | QHeaderView 的部件 |
::separator | QMenu 或 QMainWindow 中的分隔符 |
::sub-line | QScrollBar 减去行的按钮 |
::sub-page | QScrollBar 的控制柄(滑块)和子行之间的区域 |
::tab | QTabar 或 QToolBox 的选项卡 |
::tab-bar | QTabWidget 的选项卡栏。这个子控件的存在只是为了控制 QTabWidget 中 QTabBar 的位置 |
::tear | QTabBar 的撕裂指示器 |
:tearoff | QMenu 的撕裂指示器 |
::text | QAbstractItemView 的文本 |
::title | QGroupBox 或 QDockWidget 的标题 |
::up-arrow | QHeaderView (排序指示符)、QScrollBar 或 QSpinBox 的向上箭头 |
::up-button | QSpinBox 的向上按钮 |
建议控制调侃频率,避免消解主题深度。
实验数据可增加误差分析以提高严谨性。
反驳对手观点时需更注重逻辑严密性。
作者的布局谋篇匠心独运,让读者在阅读中享受到了思维的乐趣。