打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Qt 样式表之QSS

前言

最近想给程序做个换皮肤的功能,于是想起了用 QSS。QSS 这个东西也算是老古董了,博主刚工作那会就有接触过,但是没有深入去了解,趁着这一次机会来学习一下。网上翻阅了一些资料,结合 Qt 的官方文档,博主把 QSS 的相关知识点整理了一下,希望对大家有帮助,也方便自己后期回顾。

一. QSS 简介

QSS 全称为 Qt Style Sheets 也就是 Qt 样式表,它是 Qt 提供的一种用来自定义控件外观的机制。QSS 大量参考了 CSS 的内容,只不过 QSS 的功能要比 CSS 弱很多,体现在选择器要少,可以使用的 QSS 属性也要少很多,并且并不是所有的属性都可以用在 Qt 的所有控件上。

二. QSS 语法高亮

通过 “工具” -> “选项” 进入设置,通过 “text/css” 快速定位,然后在详情中添加 “*.qss” 即可实现 QSS 文件语法高亮,注意分隔符用 ';’

三. 如何在 Qt 程序中加载 QSS

void MainWindow::changeStyle(QString fileName)
{
    QString path = ":/qss/"+ fileName;
    QFile file(path);

    if ( file.open(QFile::ReadOnly) )
    {
        QString qss = QLatin1String(file.readAll());
        this->setStyleSheet(qss);
        file.close();
    }
}

四. QSS 语法解析

这里先献上 Qt 的 QSS 官方文档QSS 官方示例,方便大家查阅对比。

  1. 基础语法
    selector { attribute : value };
    其中:
    selector 选择器:通常情况下为控件类名(如 QPushButton);
    attribute 属性:待设置的样式表属性(如 background-color);
    value 值:属性赋值(如 rgb(40, 85, 20););
    示例:QPushButton { color: red }

*注:Qt 样式表通常不区分大小写(即,color、Color、color 和 color 指的是同一属性)但是类名、对象名和 Qt 属性名,它们是区分大小写的;

  1. 共享属性
QCheckBox, QComboBox, QSpinBox 
{
	color:rgb(255,0,0);
	background-color:rgb(255,255,255);
	font:bold;
}

这样就设置了所有作用范围内的 QCheckBox、QComboBox、QSpinBox 的前景色、背景色和字体;

  1. 选择器(SELECTOR)
    Qt 样式表支持 CSS2 中定义的所有选择器,下表总结了最常用的选择器类型:
选择器举例解释
通用选择器*所有 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 下拉箭头
  1. 伪状态(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;
}

下表为 QSS 官方文档翻译过来的全部伪状态:

伪状态解释
:active此状态在 widget 驻留在活动窗口中时设置
adjoins-item此状态在 QTreeView 的 ::branch 与项相邻时设置
:alternate当 QAbstractItemView::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该项具有不确定状态。例如,部分选中 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该项目具有垂直方向
:windowwidget是窗口(即顶层小部件)
  1. 子控件
    要设置复杂的 widget 样式,需要访问 widget 的子控件,如 QComboBox 的下拉按钮或 QSpinBox 的上下箭头。选择器可以包含子控件,从而可以将规则的应用限制到特定的 widget 子控件;

下表为 QSS 官方文档翻译过来的全部子控件:

子控件说明
::add-lineQScrollBar 添加行的按钮
::add-pageQScrollBar 的控制柄(滑块)和添加线之间的区域
::branchQTreeView 的分支指示符
::chunkQProgressBar 的进度块
::close-buttonQDockWidget 或 QTabBar 选项卡的关闭按钮
::corner在 QAbstractScrollArea 中两个滚动条之间的角
::down-arrowQComboBox、QHeaderView(排序指示符)、QScrollBar 或 QSpinBox 的向下箭头
::down-buttonQScrollBar 或 QSpinBox 的向下按钮
::drop-downQComboBox 的下拉按钮
::float-buttonQDockWidget 的浮动按钮
::grooveQSlider 的槽
::indicatorQAbstractItemView、QCheckBox、QRadioButton、可点击的 QMenu 项或可点击的 QGroupBox 的指示器
::handleQScrollBar、QSplitter 或 QSlider 的手柄(滑块)
::iconQAbstractItemView 或 QMenu 的图标
::itemQAbstractItemView、QMenuBar、QMenu 或 QStatusBar 的项
::left-arrowQScrollBar 的左箭头
::left-cornerQTabWidget 的左角。例如,此控件可用于控制 QTabWidget 中的左角小部件的位置
::menu-arrow带有菜单的 QToolButton 的箭头
::menu-buttonQToolButton 的菜单按钮
::menu-indicatorQPushButton 的菜单指示器
::right-arrowQMenu 或 QScrollBar 的右箭头
::paneQTabWidget 的窗格(框架)
::right-cornerQTabWidget 的右角。例如,此控件可用于控制 QTabWidget 中右角小部件的位置
::scrollerQMenu 或 QTabBar 的滚动条
::sectionQHeaderView 的部件
::separatorQMenu 或 QMainWindow 中的分隔符
::sub-lineQScrollBar 减去行的按钮
::sub-pageQScrollBar 的控制柄(滑块)和子行之间的区域
::tabQTabar 或 QToolBox 的选项卡
::tab-barQTabWidget 的选项卡栏。这个子控件的存在只是为了控制 QTabWidget 中 QTabBar 的位置
::tearQTabBar 的撕裂指示器
::tearoffQMenu 的撕裂指示器
::textQAbstractItemView 的文本
::titleQGroupBox 或 QDockWidget 的标题
::up-arrowQHeaderView(排序指示符)、QScrollBar 或 QSpinBox 的向上箭头
::up-buttonQSpinBox 的向上按钮

五. 案例展示

  1. 原始经典
  2. 爆炎黑
  3. 天空蓝
  4. 亚麻橙
  5. 工业灰
  6. 森林绿
  7. 梦幻紫
  8. 冰川银
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
浅谈样式表QSS的应用
[转载] QT皮肤(QSS)编程
QT样式表
QSS总结以及最近做的Qt项目
Qt StyleSheet样式表实例(转)
Qt之界面实现技巧
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服