当前位置: 首页 > news >正文

Qt 样式表qss学习

语法

/* 语法结构 */
selector { attribute: value }

selector(选择器)

  • selector(选择器):指定要应用样式的控件类型或特定控件。例如:
    • QWidget:所有QWidget及其子类。
    • QPushButton:所有QPushButton控件。
    • QGroupBox:所有QGroupBox控件。
    • #objectName:通过对象名称指定特定控件。
    • .className:通过样式表类名指定特定控件。
    • :pseudo-state:指定控件的伪状态(如:hover:pressed等)。

选择器类型:

选择器类型示例说明
通用选择器*匹配所有部件
类型选择器QPushButton匹配所有QPushButton实例及其所有子类
属性选择器QPushButton[flat = "false"]匹配QPushButton的属性flatfalse的实例
类选择器.QPushButton匹配所有QPushButton实例,但不包括它的子类
ID选择器QPushButton#myButton匹配所有QPushButtonmyButton对象的实例
后代选择器QDialog QPushButton匹配所有QPushButton实例,它们必须是QDialog的子孙部件
孩子选择器QDialog>QPushButton匹配所有QPushButton实例,它们必须是QDialog直系孩子部件

子控件:
对于一些复杂的部件修改样式,可能需要访问它们的子部件,如QComboBox的下拉按钮,QSpinBox的向上、向下箭头灯。用:: 访问。

子控件描述
::add-lineQScrollBar中跳转下一行的按钮
::add-pageQScrollBar中滑动条和add-line之间的区域
::branchQTreeView中的分支指示器
::chunkQProgressBar中的进度块
::close-buttonQDockWidgetQTabBar选项卡的关闭按钮
::cornerQAbstractScrollArea中两个滚动条之间的角落
::down-arrowQComboBoxQHeaderView(排序指示器)、QScrollBarQSpinBox的向下箭头
::down-buttonQScrollBarQSpinBox中的向下按钮
::drop-downQComboBox中的下拉框
::float-buttonQDockWidget中的浮动按钮
::grooveQSlider中的滑动槽
::indicatorQAbstractItemViewQCheckBoxQRadioButton、可选中的菜单项或可选中的QGroupBox中的指示器
::handleQScrollBarQSplitterQSlider中的操作条(滑动条)
::iconQAbstractItemViewQMenu中的图标
::itemQAbstractItemViewQMenuBarQMenuQStatusBar中的一项
::left-arrowQScrollBar中的向左箭头
::left-cornerQTabWidget中的左上角
::menu-arrow带有菜单的QToolButton中的箭头
::menu-buttonQToolButton中的菜单按钮
::menu-indicatorQPushButton中的菜单指示器
::right-arrowQMenuQScrollBar中的向右箭头
::paneQTabWidget中的边或框
::right-cornerQTabWidget中的右上角
::scrollerQMenuQTabBar中的滚动条
::sectionQHeaderView中的区块
::separatorQMenuQMainWindow中分隔条
::sub-lineQScrollBar中跳转上一行的按钮
::sub-pageQScrollBar中滑动条和sub-line之间的区域
::tabQTabBarQToolBox中选项卡
::tab-barQTabWidget中的选项卡栏
::tearQTabBar中的tear指示器
::tearoffQMenu中的tear-off指示器
::textQAbstractItemView中的文本
::titleQGroupBoxQDockWidget中的标题栏
::up-arrowQComboBoxQHeaderView(排序指示器)、QScrollBarQSpinBox的向上箭头
::up-buttonQScrollBarQSpinBox中的向上按钮

伪状态:
选择器可以使用状态来限制在部件的指定状态上的应用。伪状态在选择器之后,用冒号:隔离。如:鼠标悬停在按钮上时其按钮的颜色为白色QPushButton:hover{color:white}

伪状态描述
:active此状态在小部件驻留在活动窗口时设置
:adjoins-item此状态在QTreeView::branch与一个item相邻时设置
:alternateQAbstractItemView::alternatingRowColors()设置为真时,在绘制QAbstractItemView的行时,为每个交替行设置此状态
:bottomitem位于底部。例如,QTabBar有位于底部的选项卡
:checkeditem被选中。例如,QAbstractButtonchecked状态
:closableitem可以被关闭。例如,QDockWidgetQDockWidget::DockWidgetClosable特性开启时
:closeditem处于关闭状态。例如,QTreeView中未展开的item
:defaultitem的默认状态。例如,一个默认的QPushButtonQMenu中的一个默认动作
:disableditem被禁用时的状态
:editableQComboBox是可编辑的
:edit-focusitem具有编辑焦点(参考QStyle::State_HasEditFocus)。此状态仅对Qt扩展应用程序可用
:enableditem已启用
:exclusiveitem是一个独占项组的一部分。例如,独占QActionGroup中的菜单项
:firstitem是列表中的第一项。例如,QTabBar中的第一个选项卡
:flatitem是平的。例如,一个扁平的QPushButton
:floatableitem可以浮动。例如,QDockWidgetQDockWidget::DockWidgetFloatable的特性开启时
:focusitem具有输入焦点
:has-childrenitem具有子对象。例如,QTreeView中具有子项的项
:has-siblingitem具有兄弟对象。例如,QTreeView中与之相邻的项
:horizontalitem处于水平方向
:hover鼠标悬浮在此item
:indeterminateitem处于不确定状态。例如,QCheckBoxQRadioButton被部分选中
:lastitem是列表中的最后一项。例如,QTabBar中的最后一个选项卡
:leftitem位于左侧。例如,QTabBar有位于左侧的选项卡
:maximizeditem处于最大化状态。例如,一个最大化的QMdiSubWindow
:middleitem是列表中的中间一项。例如,一个不在QTabBar中的开头或结尾的选项卡
:minimizeditem处于最小化状态。例如,一个最小化的QMdiSubWindow
:movableitem可以被移动。例如,QDockWidgetQDockWidget::DockWidgetMovable特性开启时
:no-frameitem没有边框。例如,没有边框的QSpinBoxQLineEdit
:non-exclusiveitem是一个非独占项组的一部分。例如,非独占QActionGroup中的菜单项
:off对可以切换的items,这适用于处于off状态的item
:on对可以切换的items,这适用于处于on状态的widget
:only-oneitem是列表中的唯一的一项。例如,一个在QTabBar中单独的选项卡
:openitem处于打开状态。例如,QTreeView中的展开项,或带有菜单的QComboBoxQPushButton
:next-selecteditem是列表中的下一个被选中的项。例如,在QTabBar中当前选项卡的下一个要选中的选项卡
:pressed鼠标正在按压在此item
:previous-selecteditem是列表中的上一个被选中的项。例如,在QTabBar中当前选项卡的上一个要选中的选项卡
:read-onlyitem处于只读或不可编辑状态。例如,一个只读QLineEdit或不可编辑的QComboBox
:rightitem位于右侧。例如,QTabBar有位于右侧的选项卡
:selecteditem处于选中状态。例如,一个在QTabBar中被选中的选项卡或一个在菜单中被选中的菜单项
:topitem位于顶部。例如,QTabBar有位于顶部的选项卡
:uncheckeditem处于未被选中状态
:verticalitem处于垂直方向
:window小部件是一个窗口(例如,一个顶层小部件)

attribute(属性)

官方文档
第三方教程

  • attribute(属性):定义控件的外观特性,如颜色、边框、背景等。
    • color:文本颜色。
    • background-color:背景颜色。
    • border:边框样式。
    • padding:内边距。
    • margin:外边距。
    • font:字体样式。
    • selection-color:选中时的文本颜色。
    • selection-background-color:选中时的背景颜色。

value(值)

  • value(值):与属性对应的值,可以是颜色、尺寸、字体等。

支持BOX MODEL
在这里插入图片描述
marginborder-widthpadding属性都默认为0。在这种情况下,所有四个矩形(边距边框填充内容)都完全重合。


冲突

样式冲突解决原则:
在Qt样式表(QSS)中,当多个样式规则对同一个属性指定不同的值时,就会产生冲突。Qt通过一套优先级规则来解决这些冲突,确保最终的样式是明确且一致的。

示例
QPushButton#okButton { color: gray; }
QPushButton { color: red; }

在这个例子中:

  • QPushButton#okButton 是一个ID选择器,它针对的是具有特定ID(okButton)的QPushButton实例。
  • QPushButton 是一个类型选择器,它针对的是所有QPushButton实例。
冲突解决规则
  1. 特殊选择器优先

    • ID选择器(如#okButton)比类型选择器(如QPushButton)更具体,因此具有更高的优先级。
    • 在这个例子中,QPushButton#okButton的样式规则会覆盖QPushButton的样式规则。
    • 因此,okButton按钮的文本颜色将是灰色(gray),而不是红色(red)。
  2. 伪状态的优先级

    • 如果样式规则中包含伪状态(如:hover:pressed等),这些规则的优先级会更高。
    • 例如:
      QPushButton:hover { color: white; }
      QPushButton { color: red; }
      
      在这个例子中,当鼠标悬停在按钮上时,按钮的文本颜色将是白色(white),而不是红色(red)。
  3. 多个伪状态的组合

    • 伪状态可以组合使用,以实现更复杂的样式规则。
    • 例如:
      QPushButton:hover:checked { color: blue; }
      QPushButton:hover { color: white; }
      QPushButton { color: red; }
      
      在这个例子中:
      • 当按钮被选中且鼠标悬停时,文本颜色将是蓝色(blue)。
      • 当按钮未被选中但鼠标悬停时,文本颜色将是白色(white)。
      • 当按钮既没有被选中也没有鼠标悬停时,文本颜色将是红色(red)。
  4. 逻辑或的使用

    • 伪状态可以通过逗号分隔,实现逻辑或的效果。
    • 例如:
      QPushButton:hover, QPushButton:checked { color: white; }
      QPushButton { color: red; }
      
      在这个例子中:
      • 当按钮被鼠标悬停或被选中时,文本颜色将是白色(white)。
      • 当按钮既没有被鼠标悬停也没有被选中时,文本颜色将是红色(red)。

qss 示例

qss示例


示例:

1. 基本样式
QWidget {background-color: rgb(255, 255, 255); /* 白色背景 */color: rgb(0, 0, 0); /* 黑色文本 */font: 14px "Arial"; /* 字体大小和字体 */
}
2. 指定控件样式
QPushButton {background-color: rgb(255, 0, 0); /* 红色背景 */color: rgb(255, 255, 255); /* 白色文本 */border: 2px solid rgb(0, 0, 0); /* 黑色边框 */border-radius: 10px; /* 圆角边框 */padding: 5px; /* 内边距 */
}
3. 使用对象名称
QWidget#filemanager_memeryArea {background-color: rgb(228, 228, 228); /* 灰色背景 */border-radius: 5px; /* 圆角边框 */
}
4. 伪状态
QPushButton:hover {background-color: rgb(255, 165, 0); /* 鼠标悬停时的背景色 */
}QPushButton:pressed {background-color: rgb(0, 255, 0); /* 按下时的背景色 */
}
5. 子控件样式
QGroupBox::title {subcontrol-origin: margin;subcontrol-position: top center;padding: 0 3px;background-color: rgb(200, 200, 200);
}
6. 组合选择器
QLineEdit, QComboBox {background-color: rgb(255, 255, 255); /* 白色背景 */border: 1px solid rgb(0, 0, 0); /* 黑色边框 */
}
7. 嵌套控件
QDialog QWidget {background-color: rgb(240, 240, 240); /* 对话框中的所有QWidget */
}

使用方式:

#include <QApplication>
#include <QFile>
#include <QTextStream>
#include <QDebug>int main(int argc, char *argv[]) {QApplication app(argc, argv);QString styleSheetPath = ":/qdarkstyle/dark/darkstyle.qss"; // 替换为你的样式表路径QFile f(styleSheetPath);if (!f.exists()) {qDebug() << "Unable to set stylesheet, file not found:" << styleSheetPath;} else {f.open(QFile::ReadOnly | QFile::Text);QTextStream ts(&f);					// 流式加载app.setStyleSheet(ts.readAll());	// 这里应用}QWidget window;window.setWindowTitle("Test Window");window.resize(400, 300);window.show();return app.exec();
}

参考1

相关文章:

  • 【Qt】之音视频编程2:QtAV的使用篇
  • Kubernetes容器运行时:Containerd vs Docker
  • 奇妙小博客
  • 项目里程碑未被明确,如何有效控制进度
  • Java Solon v3.3.0 发布(国产优秀应用开发基座)
  • 操作实例 :使用rpm命令安装并解压RAR文档的工具软件UNRAR
  • 初入OpenCV
  • 用vite脚手架建立 前端工程
  • LabVIEW 编程难点
  • Shinkai开源程序 是一个双击安装 AI 管理器(本地和远程),它允许您使用简单的 UI 在 5 分钟或更短的时间内创建 AI 代理
  • VUE_UI组件的二次封装
  • GPT( Generative Pre-trained Transformer )模型:基于Transformer
  • React中的状态管理Dva总结
  • 理解 C# 中的各类指针
  • Android加固工具测评:易盾、顶象、360加固哪款更好用?
  • 【爬虫】DrissionPage-1
  • const char* 指向字符串数组和字符串的区别
  • 超声波传感器模块
  • llamafactory-记录一次消除模型随机性的成功过程
  • ElasticSearch深入解析(十一):分页
  • 前四个月人民币贷款增加10.06万亿元,4月末M2余额同比增长8%
  • 加强战略矿产出口全链条管控将重点开展哪些工作?商务部答问
  • 国台办:实现祖国完全统一是大势所趋、大义所在、民心所向
  • 筑牢安全防线、提升应急避难能力水平,5项国家标准发布
  • 生态环境保护督察工作条例对督察对象和内容作了哪些规定?有关负责人答问
  • 青海规范旅游包车行为:不得引导外省籍旅游包车违规驻地运营