Qt 样式表之QSS

2023-11-05

前言

最近想给程序做个换皮肤的功能,于是想起了用 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 该项目已禁用
: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是窗口(即顶层小部件)
  1. 子控件
    要设置复杂的 widget 样式,需要访问 widget 的子控件,如 QComboBox 的下拉按钮或 QSpinBox 的上下箭头。选择器可以包含子控件,从而可以将规则的应用限制到特定的 widget 子控件;

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

子控件 说明
::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 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 的向上按钮

五. 案例展示

  1. 原始经典
    在这里插入图片描述
  2. 爆炎黑
    在这里插入图片描述
  3. 天空蓝
    在这里插入图片描述
  4. 亚麻橙
    在这里插入图片描述
  5. 工业灰
    在这里插入图片描述
  6. 森林绿
    在这里插入图片描述
  7. 梦幻紫
    在这里插入图片描述
  8. 冰川银
    在这里插入图片描述
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt 样式表之QSS 的相关文章

  • 安装多个版本的 Qt 库

    我在windows中安装了QtSDK 它的Qt库版本是4 7 0 现在我想为 mingw 和 VS2008 安装 Qt 库版本 4 8 2 我怎样才能做到这一点 如何向QtCreator引入多个版本 注意 我已经从以下位置下载了库http
  • QLineEdit:显示处理后的文本,而不是输入的文本,但保留它(自定义回显模式)

    我想要一个QLineEdit不显示输入的文本 而是显示经过处理的版本 同时保留原始文本并在通过请求时返回它text 就像密码回显模式一样 但我不希望每个字符都被屏蔽 我想虚拟化空间 例如什么时候some text with spaces i
  • QT 中只获取文件而不获取目录?

    当我这样做时 QDir myDir home some location QStringList filesList myDir entryList 它返回该位置内的文件和目录 但我只想要文件 并且这些文件可以具有任意扩展名 有任何想法吗
  • 如何在 Qt-Embedded 中(正确)输出多语言文本?

    我的目标系统是 linux 3 3 7 Qt Embedded 开源版 4 8 Droid 字体 取自 fonts droid 20111207 git 1 all deb Debian 软件包并复制到 usr lib fonts目录 主要
  • QSpinBox 输入 NaN 作为有效值

    我正在尝试扩展 QSpinBox 以能够输入 NaN 或 nan 作为有效值 根据文档 我应该使用 textFromValue valueFromText 和 validate 函数来完成此操作 但我无法让它工作 因为它仍然不允许我输入除数
  • 有没有办法在没有 QApplication::exec() 的情况下使用 Qt?

    有没有一种安全的方法可以在不调用 QApplication exec 的情况下使用 Qt 我有许多不同的对象正在对多个资源执行长期进程 至少其中一个正在与 Web 应用程序服务器进行通信 我正在制作一个 GUI 应用程序 提示用户在正确的时
  • 如何创建QWidget的屏幕截图?

    我在 Qt Creator 中做作业 在其中绘制 QWidget 并且需要保存此 QWdiget 的某些部分 我试图解决这个问题 QPixmap pixmap pixmap copy rectangle rectangle is part
  • Qt中如何获取鼠标在屏幕上的位置?

    我想获取屏幕上的鼠标坐标 我怎样才能在 Qt 中做到这一点 在 Windows 上 使用 C 我正在做类似答案中建议的事情对于这个问题 https stackoverflow com q 11737665 1420197 正如文档所述 QC
  • QTcpSocket 有时不发送数据

    我有两个 QT 应用程序 一个应用程序可以被认为保存了大数据 它每秒向第二个应用程序发送大约 10 KB 的数据块 之前我尝试使用QUdpSocket来传输数据 但由于MTU限制在2 5K左右 并且需要自己分割和重新组合数据 所以我改用QT
  • 如何使用 Qtimer 添加 1 秒延迟

    我目前有一个方法如下 void SomeMethod int a Delay for one sec timer gt start 1000 After one sec SomeOtherFunction a 这个方法实际上是一个附加到信号
  • 加权 Voronoi 的 CGAL 2D APOLLONIUS 图 - 如何生成和获取面和顶点?

    我正在尝试根据阿波罗尼乌斯图生成加权沃罗诺伊 我正在使用 CGAL 库 我找不到如何从 apollonius 获取面和顶点的好例子 我有以下类型定义 typedef double NT typedef CGAL Cartesian lt N
  • 如何将图像显示为缩略图

    我有一个QTreeView显示硬盘驱动器和目录 我也有一个QListView显示图像文件如下 但我想将图像显示为缩略图 如下所示 My code mainWidget mainWidget QWidget parent QWidget pa
  • 与 Qt 项目的静态链接

    我有一个在 Visual Studio 2010 Professional 中构建的 Qt 项目 但是 当我运行它 在调试或发布模式下 时 它会要求一些 Qt dll 如果我提供 dll 并将它们放入 System32 中 它就可以工作 但
  • 使用 QtWebEngine 将 C++ 对象暴露给 Qt 中的 Javascript

    使用 QtWebkit 可以通过以下方式将 C 对象公开给 JavascriptQWebFrame addToJavaScriptWindowObject如中所述https stackoverflow com a 20685002 5959
  • Qml 模块未找到 CPP 类注册与新的 QML_ELEMENT r

    我尝试使用 Qt5 15 0 和新宏 QML ELEMENT 在 QML 中注册我的自定义 CPP 类 但找不到该模块 Qt Creater 帮助文件描述了 QML ELEMENT 的步骤 我也检查了 Qt 手册 但没有幸福的结局 http
  • Qt - 无法让 lambda 工作[重复]

    这个问题在这里已经有答案了 我有以下功能 我想在其中修剪我的std set
  • Qt - 设置不可编辑的QComboBox的显示文本

    我想将 QComboBox 的文本设置为某些自定义文本 不在 QComboBox 的列表中 而不将此文本添加为 QComboBox 的项目 此行为可以在可编辑的 QComboBox 上实现QComboBox setEditText cons
  • Qt 是否已经有了自己的 new 和 delete 运算符?

    我正在使用一个QGraphicsScene小部件并在其上显示一些点QGraphicsRectItem 这意味着要拨打很多电话new addItem 当出现时 并且removeItem delete摆脱未使用的点 当然 对于性能问题 我已经实
  • 在高 dpi Windows 平台上自动重新缩放应用程序?

    我正在编写一个需要在高 dpi Windows 192dpi 而不是 96dpi 上运行的 Qt 应用程序 不幸的是 Qt 框架尚不支持高 dpi 至少在 Windows 上 因此我的应用程序及其所有元素看起来只有应有尺寸的一半 有没有办法
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table

随机推荐

  • 【JAVA

    package learn import java awt import javax swing import java awt event public class PinBall private Frame frame new Fram
  • 中国金融牌照全解读

    前言 金融牌照 即金融机构经营许可证 是批准金融机构开展业务的正式文件 目前金融许可证由银监会 证监会和保监会等部门分别颁发 金融监管根据时段划分为事前监管 事中监管 事后监管 市场准入制度是事前监管的核心 金融许可证则是市场准入制度的常态
  • ITERM2 自动登录跳板机脚本(多跳、带动态TOKEN)

    代码如下 设置方式是 iterm2 preference Profiles 新建一个profile 并设置Name为a Command为 Users XXX Desktop a sh 在sen text as start内传入4个参数 US
  • Android开发——菜单(Menu)-——选项菜单(OptionMenu)

    Menu 在Android3 0以前的menu显示 是用户点击手机下方操作按钮的菜单按钮时 会从界面底部向上弹出菜单 菜单内容出现在屏幕底部 可以包含六个及以上的菜单项 超出的部分则以 更多 来显示 在Android3 0以后的更高版本的系
  • git clone使用方法

    步骤是转载的该文章 后面有添加自己的要注意的地方 不完全一样 仅码住自用 使用Git clone项目 1 首先我们要确保我们的电脑上已经安装Git 桌面点击右键出现如下图所示的两个Git即Git已经安装 2 在电脑的任意一个磁盘里新建一个本
  • ARM公司发展史

    目录 1 前言 2 ARM公司发展史 3 ARM架构发展史 3 1ARMv1架构 3 2 ARMv2架构 3 3 ARMv3架构 3 4 ARMv4架构 3 5 ARMv5架构 3 6 ARMv6架构 3 7 ARMv7架构 3 8 ARM
  • 关于存储器按字节寻址和按字寻址的理解

    关于存储器按字节寻址和按字寻址的理解 近日在学习MOOC上学习哈工大刘宏伟老师的 计算机系统组成原理 课程 在4 1节提到主存的时候简单地提到一下关于按字节寻址和按字寻址的寻址空间问题 个人非常疑惑于是各处搜索查找资料 下面是本人就这个问题
  • 【机器学习】左逆、右逆、伪逆和广义逆的概念理解

    逆矩阵 对于矩阵 A A A 如果存在一个矩阵 B B B 使得 A B B
  • spring boot配置logback日志

    spring boot配置logback日志 第一次用 markdown编辑 哈哈 在上一篇spring boot入门里提过 Spring Boot默认的日志打印是logback 所以配置logback日志会很简单 但是也有注意的地方 本次
  • vue实时监听窗口宽度变化

    自适应 向来是前端工程师需要解决的一大问题 即便作为当今非常火热的vue框架 也无法摆脱 虽然elementui iview等开源UI组件库层出不穷 但官方库毕竟不可能满足全部需求 因此我们可以通过 监听窗口变化 达到想要的绝大部分自适应效
  • spring Cache的缓存记录

    使用Spring Cache需要我们做两方面的事 n 声明某些方法使用缓存 n 配置Spring对Cache的支持 和Spring对事务管理的支持一样 Spring对Cache的支持也有基于注解和基于XML配置两种方式 下面我们先来看看基于
  • C++(day3)

    思维导图 封装顺序栈 stack h ifndef STACK H define STACK H include
  • 激活函数之ReLU/softplus介绍及C++实现

    softplus函数 softplus function x ln 1 exp x softplus函数可以用来产生正态分布的 和 参数 因为它的范围是 0 当处理包含sigmoid函数的表达式时它也经常出现 softplus函数名字来源于
  • 裸奔时代,区块链技术能否帮助我们保护个人隐私?

    在这个信息交流飞速发展的年代 在人们在享受互联网信息带来的便利的同时 常常会感慨这是一个没有隐私的裸奔时代 对于个人信息的泄露大家已经见怪不怪了 网络爬虫 人肉搜索等手段的问世 将人们的生活置于各种显微镜下 各种促销或骚扰电话让人不胜其烦
  • python中函数介绍及其运用

    前言 一 定义函数 二 传递实参 1 位置实参 2 关键字实参 3 给形参指定默认值 三 函数返回值 1 返回简单值 2 返回字典 3 结合使用函数和while 循环 四 传递列表 1 在函数中调用列表 2 在函数中修改列表 3 禁止在函数
  • qt中信号与槽多次调用的问题及信号与槽的连接方式问题

    发送一次信号 调用多次槽函数问题 在同一个类中 多次链接QObject connect sender SIGNAL signalSender QString int receiver SLOT onSignalSender QString
  • java poi 4.1.2 操作excel说明

    文章目录 描述 导包 excel写入 excel读取 数据类型与多行多列 描述 poi是Apache下一款java语言excle高效读写工具 本博客将从读 写等方面做说明 xls 2007前版本 和xlsx 2007版本和此后 使用不同类
  • bat:使用bat脚本获得文件名,修改时间,大小

    echo for i in D J 1012 ftprun log do echo nxi echo zi字节 echo ti echo Y gt ni log pause
  • 固高运动控制卡IO口输入输出

    固高运动控制卡开发资料 关注我免费下载 输入 板卡上的输入 long ss 0 GT GetDi MC GPI ss bool gpists 1 lt lt bit 1 bit为输入接口号 拓展模块的输入 short Extflag 0 返
  • Qt 样式表之QSS

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