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

QT中QSS样式表的详细介绍

转自个人博客

**Qt样式表(Qt Style Sheets,简称QSS)**是一种类似于HTML中的CSS(层叠样式表)的机制,用于自定义Qt应用程序的外观。通过QSS,开发者可以轻松地修改控件的外观,而无需更改底层代码逻辑。这种方式不仅提高了开发效率,还增强了界面设计的灵活性。


1. QSS概要

1.1 QSS作用

QSS允许开发者通过声明式的方式设置控件的外观属性,例如颜色、字体、边框、间距等。与直接在代码中设置样式相比,QSS具有以下优点:

  • 分离样式与逻辑:样式和功能代码分离,便于维护。
  • 动态切换主题:可以通过加载不同的QSS文件实现主题切换。
  • 跨平台一致性:确保不同平台上的控件外观一致。

1.2 QSS与CSS的关系

QSS借鉴了CSS的设计思想,语法上非常相似。熟悉CSS的开发者可以快速上手QSS。然而,QSS是专门为Qt控件设计的,因此支持的属性和选择器可能与CSS有所不同。

1.3 QSS基本语法

QSS的基本语法如下:

选择器 {属性:;
}
  • 选择器:用于指定要应用样式的控件或控件组,支持多种类型的选择器来具体选择应用样式的对象。
  • 属性:控件的外观属性。
  • :属性的具体取值,不同的属性可能需要使用不同的值。
QPushButton {color: white;background-color: blue;border: 1px solid black;
}

1.4 QSS在QT中的使用

  1. 可以在Qt Designer中直接键入样式表

  2. 在Qt中对指定控件使用setStyleSheet(样式表字符串)方法设置。

    • 参数是字符串类型,引号内使用QSS语法,如果多行书写,也要记得将每一行套用双引号来转化成一个字符串。
    • 样式表是默认递归套用到子控件的,如果只想套用到指定的控件,就需要细分选择选择器。
    • 对一个控件不支持重复设置样式表,只有最后一个设置的样式表生效。但可以分别对父控件和子控件设置不同样式表,默认子控件样式在父控件之上生效。
    • 因为这种方法是直接对控件设置样式表,所以也支持省略选择器,以自动套用当前控件类型。
    // 对整个控件如下应用样式表会套用到所有子控件QPushButton上
    auto myWidget = new QWidget();
    myWidget->setStyleSheet("QPushButton { background-color: yellow }"); 
    // 多行书写需要每一行使用双引号来合并成一个字符串
    myWidget->setStyleSheet("QWidget { background-color: #3a3a3a }""QPushButton { background-color: yellow }");// 也可以直接对控件设置样式
    auto myButton = new QPushButton();
    myButton->setStyleSheet("background-color: yellow");

2. QSS选择器

2.1 选择器类型

QSS支持多种选择器,常用的包括:

  1. 类型选择器:根据控件类型应用样式。具体支持的控件类型见2.2。

    QPushButton {color: red;
    }
    
  2. 类选择器:根据控件的objectNameclass属性应用样式,使用**#**来指定控件名称。

    可以先使用控件的getObjectName()方法获取控件名称,或者使用setObjectName(QString name)方法来指定控件名称

    QPushButton#myButton { /* 允许省略QPushButton */background-color: green;
    }
    
    // 设置、查看控件名称
    auto myButton = new QPushButton();
    myWidget->setObjectName("myButton");
    myWidget->getObjectName(); // 返回"myButton"
    
  3. 子控件选择器:针对复合控件的子部件应用样式,使用**::**来指定子控件。

    QComboBox::drop-down { /* 下拉按钮 */image: url(dropdown.png); /* 自定义箭头图标 */
    }
    
  4. 状态选择器:根据控件的状态(如hoverpressed)应用样式,使用**:**来指定控件状态。

    QPushButton:hover {background-color: yellow;
    }
    

2.2 选择器控件列表

控件类型说明子部件伪状态
QWidget所有控件的基类,支持通用样式属性(如背景颜色、边框等)。
QAbstractScrollArea滚动区域的抽象基类,支持滚动条样式。::corner(滚动条交汇处的角落区域),::viewport(滚动区域的内容视图)
QDialog对话框的基类,支持对话框窗口和子控件的样式。
QAbstractButton抽象按钮基类,支持按钮样式(如文本、图标、背景等)。:hover(鼠标悬停时),:pressed(鼠标按下时),:checked(按钮被选中时),:unchecked(按钮未被选中时),:disabled(按钮被禁用时)
QPushButton标准按钮控件,支持按钮样式。:hover(鼠标悬停时),:pressed(鼠标按下时),:checked(按钮被选中时),:unchecked(按钮未被选中时),:disabled(按钮被禁用时),:default(默认按钮),:flat(扁平化按钮)
QRadioButton单选按钮控件,支持单选按钮样式。:hover(鼠标悬停时),:pressed(鼠标按下时),:checked(按钮被选中时),:unchecked(按钮未被选中时),:disabled(按钮被禁用时)
QCheckBox复选框控件,支持复选框样式。:hover(鼠标悬停时),:pressed(鼠标按下时),:checked(按钮被选中时),:unchecked(按钮未被选中时),:indeterminate(不确定状态),:disabled(按钮被禁用时)
QComboBox下拉框控件,支持下拉按钮、箭头、列表项等子控件样式。::drop-down(下拉按钮),::down-arrow(下拉箭头),::item(下拉列表中的项),::indicator(选中指示器):hover(鼠标悬停时),:pressed(鼠标按下时),:disabled(控件被禁用时),:on(下拉框打开时),:off(下拉框关闭时)
QScrollBar滚动条控件,支持滑块、增加/减少按钮等子控件样式。::handle(滑块),::add-line(增加按钮),::sub-line(减少按钮),::add-page(滑块上方的背景区域),::sub-page(滑块下方的背景区域):hover(鼠标悬停时),:pressed(鼠标按下时),:disabled(滚动条被禁用时)
QSlider滑块控件,支持滑块手柄样式。::groove(滑槽),::handle(滑块手柄),::add-page(滑块上方的背景区域),::sub-page(滑块下方的背景区域):hover(鼠标悬停时),:pressed(鼠标按下时),:disabled(滑块被禁用时)
QProgressBar进度条控件,支持进度块样式。::chunk(进度块):hover(鼠标悬停时),:disabled(进度条被禁用时)
QTabWidget标签页控件,支持标签栏、标签页等子控件样式。::pane(标签页的内容区域),::tab-bar(标签栏):hover(鼠标悬停时),:disabled(控件被禁用时)
QTabBar标签栏控件,支持标签页样式。::tab(标签页),::close-button(关闭按钮),::tear(拖拽分离的标签),::scroller(滚动按钮):hover(鼠标悬停时),:selected(标签页被选中时),:disabled(标签页被禁用时)
QHeaderView表头控件,支持表格或树形视图的表头样式。::section(表头单元格):hover(鼠标悬停时),:pressed(鼠标按下时),:disabled(表头被禁用时)
QMenu菜单控件,支持菜单项、分隔符等样式。::item(菜单项),::separator(分隔符),::indicator(选中指示器),::right-arrow(右箭头),::left-arrow(左箭头):hover(鼠标悬停时),:pressed(鼠标按下时),:disabled(菜单项被禁用时),:checked(菜单项被选中时),:unchecked(菜单项未被选中时)
QMenuBar菜单栏控件,支持菜单栏项样式。::item(菜单栏项):hover(鼠标悬停时),:pressed(鼠标按下时),:disabled(菜单栏项被禁用时)
QToolBar工具栏控件,支持工具栏按钮、分隔符等样式。::separator(分隔符),::handle(拖动手柄):hover(鼠标悬停时),:pressed(鼠标按下时),:disabled(工具栏被禁用时)
QDockWidget停靠窗口控件,支持标题栏、关闭按钮等样式。::title(标题栏),::close-button(关闭按钮),::float-button(浮动按钮):hover(鼠标悬停时),:pressed(鼠标按下时),:disabled(停靠窗口被禁用时)
QStatusBar状态栏控件,支持状态栏消息样式。
QMainWindow主窗口控件,支持中央部件、工具栏、状态栏等样式。
QLineEdit单行文本输入框控件,支持文本、占位符、边框等样式。::clear-button(清除按钮),::up-button(向上按钮),::down-button(向下按钮):hover(鼠标悬停时),:pressed(鼠标按下时),:disabled(输入框被禁用时),:read-only(只读模式)
QTextEdit多行文本编辑框控件,支持文本、滚动条等样式。::corner(滚动条交汇处的角落区域),::viewport(滚动区域的内容视图):hover(鼠标悬停时),:disabled(文本编辑框被禁用时)
QPlainTextEdit纯文本编辑框控件,支持文本、滚动条等样式。::corner(滚动条交汇处的角落区域),::viewport(滚动区域的内容视图):hover(鼠标悬停时),:disabled(纯文本编辑框被禁用时)
QSpinBox数值输入框控件,支持上下箭头按钮、文本等样式。::up-button(向上按钮),::down-button(向下按钮),::up-arrow(向上箭头),::down-arrow(向下箭头):hover(鼠标悬停时),:pressed(鼠标按下时),:disabled(数值输入框被禁用时)
QDoubleSpinBox双精度数值输入框控件,支持上下箭头按钮、文本等样式。::up-button(向上按钮),::down-button(向下按钮),::up-arrow(向上箭头),::down-arrow(向下箭头):hover(鼠标悬停时),:pressed(鼠标按下时),:disabled(双精度数值输入框被禁用时)
QDateTimeEdit日期时间输入框控件,支持上下箭头按钮、文本等样式。::up-button(向上按钮),::down-button(向下按钮),::up-arrow(向上箭头),::down-arrow(向下箭头):hover(鼠标悬停时),:pressed(鼠标按下时),:disabled(日期时间输入框被禁用时)
QAbstractItemView抽象项视图基类,支持表格、列表、树形视图的样式。::item(项),::branch(分支节点),::indicator(选中指示器):hover(鼠标悬停时),:selected(项被选中时),:disabled(项被禁用时),:checked(项被选中时),:unchecked(项未被选中时)
QSplitter分割器控件,支持分割线样式。::handle(拖动手柄):hover(鼠标悬停时),:pressed(鼠标按下时),:disabled(分割器被禁用时)
QCalendarWidget日历控件,支持日历网格、选中日期等样式。::navigation-bar(导航栏),::month-button(月份按钮),::year-button(年份按钮),::prev-month-button(上一月按钮),::next-month-button(下一月按钮):hover(鼠标悬停时),:pressed(鼠标按下时),:disabled(日历控件被禁用时)

3. QSS属性列表

以下是QSS支持的常用属性及其详细说明:

3.1 颜色与背景

属性描述示例
color设置文本颜色color: red;
background-color设置背景颜色background-color: blue;
background-image设置背景图片background-image: url(bg.png);
background设置背景颜色和图片background: red url(bg.png);
background-repeat设置背景图片重复方式background-repeat: no-repeat;
background-position设置背景图片位置background-position: center;

3.2 字体

属性描述示例
font-family设置字体名称font-family: Arial;
font-size设置字体大小font-size: 14px;
font-weight设置字体粗细font-weight: bold;
font-style设置字体样式(如斜体)font-style: italic;
font综合设置字体属性font: bold 14px Arial;

3.3 边框

属性描述示例
border设置边框样式border: 1px solid black;
border-radius设置圆角半径border-radius: 5px;
border-color设置边框颜色border-color: red;
border-width设置边框宽度border-width: 2px;
border-style设置边框样式(如实线、虚线)border-style: dashed;

3.4 间距与对齐

属性描述示例
padding设置内边距padding: 10px;
margin设置外边距margin: 5px;
text-align设置文本对齐方式text-align: center;
spacing设置控件内部间距spacing: 5px;
alignment设置内容对齐方式alignment: Qt::AlignCenter;

3.5 其他属性

属性描述示例
min-width设置最小宽度min-width: 100px;
max-width设置最大宽度max-width: 200px;
min-height设置最小高度min-height: 50px;
max-height设置最大高度max-height: 100px;
opacity设置透明度opacity: 0.5;
icon设置图标icon: url(icon.png);
image设置图片image: url(image.png);

4. QSS的高级用法

以下是Qt样式表(QSS)的高级用法详解。

4.1 伪状态组合(多状态叠加控制)

QSS允许通过组合多个伪状态实现精确的交互反馈。

QPushButton:hover:checked { /* 按钮同时悬停且被选中 */background-color: #FFA500;  /* 橙色 */border: 2px solid darkorange;
}

4.2 继承与层叠机制

QSS遵循CSS的层叠规则,但需注意Qt控件的样式继承特性。即前面提到的子控件可以在父控件之上设置样式。

QWidget {font-family: "Arial";font-size: 12pt;
}QPushButton { /* 是QWidget的子控件 *//* 继承自QWidget的字体设置 */color: white;
}

4.3 动态属性与条件样式

通过QObject::setProperty()动态改变控件样式。

先在代码中设置属性:

button->setProperty("priority", "high");

然后可以在QSS中匹配属性,以指定设置样式表:

QPushButton[priority="high"] {background-color: #FF4444;font-weight: bold;
}

附高级用法:状态切换动画

// 通过属性切换实现动画效果
button->setProperty("state", "active");
qApp->style()->unpolish(button);
qApp->style()->polish(button);

4.4 复杂选择器组合

通过组合选择器实现精准样式定位。

  1. 相邻兄弟选择器

    QLineEdit + QPushButton {margin-left: 10px;  /* 紧接在输入框后的按钮 */
    }
    
  2. 层级嵌套选择

    QTabWidget > QTabBar::tab:first-child {border-radius: 5px 0 0 0;  /* 第一个标签页特殊样式 */
    }
    

4.5 自定义控件样式

为自定义Widget实现完整QSS支持,可以自定义可样式化的子部件,如下:

class CustomWidget : public QWidget {Q_OBJECTQ_PROPERTY(QString mode READ mode WRITE setMode)
public:// 注册子部件类型Q_ENUMS(SubControls)enum SubControls { SC_Indicator = 0x1 };
};

然后在QSS中可以设置样式表:

CustomWidget::indicator {width: 20px;height: 20px;
}

4.6 高效调试技巧

在实际编码过程中,常用如下几种快速定位样式问题的方法。

  1. 样式探测器

    qDebug() << widget->styleSheet();  // 输出当前样式
    
  2. 边界高亮法

    * {border: 1px solid red !important;  /* 显示所有控件边界 */
    }
    
  3. 状态监测法

    // 打印控件状态
    qDebug() << "Hover:" << button->underMouse()<< "Pressed:" << button->isDown();
    

4.7 性能优化策略

  • 避免全局选择器:尽量使用ID或类选择器
  • 合并重复样式:减少重复属性定义
  • 预编译QSS:将样式表编译为二进制资源
  • 分层加载:按模块动态加载样式表
/* 优化前 */
QPushButton#okBtn { color: white; }
QPushButton#cancelBtn { color: white; }/* 优化后 */
#okBtn, #cancelBtn {color: white;
}
http://www.lryc.cn/news/578166.html

相关文章:

  • localStorage 和 sessionStorage
  • Python + Selenium 自动化爬取途牛动态网页
  • 在vue当中使用动画
  • Hily×亚矩云手机:社交元宇宙的“云端心跳加速器”
  • JVM 垃圾回收(GC)笔记
  • LLaMA-Factory框架之参数详解
  • Webpack原理剖析与实现
  • 1.1_2 计算机网络的组成和功能
  • FastDFS分布式储存
  • 华为云Flexus+DeepSeek征文 | ​​接入华为云ModelArts Studio大模型 —— AI智能法务解决方案革新法律实践​
  • 38.docker启动python解释器,pycharm通过SSH服务直连
  • ERP系统Bug记录
  • 前端Vue面试八股常考题(一)
  • 中证500股指期货一手多少钱呢?风险如何?
  • HTML5 实现的圣诞主题网站源码,使用了 HTML5 和 CSS3 技术,界面美观、节日氛围浓厚。
  • 华为云 Flexus+DeepSeek 征文|基于 Dify 平台开发智能客服 AI Agent 的完整实战指南
  • 【STM32HAL-第1讲 基础篇-单片机简介】
  • 前端开发面试题总结-原生小程序部分
  • 《从量子奇境到前端优化:解锁卡西米尔效应的隐藏力量》
  • 《用奥卡姆剃刀原理,为前端开发“减负增效”》
  • 【软考高项论文】论信息系统项目的整体管理
  • 【Java面试】10GB,1GB内存,如何排序?
  • PHP WebSocket服务器搭建指南
  • 从入门到精通:npm、npx、nvm 包管理工具详解及常用命令
  • Springboot + vue + uni-app小程序web端全套家具商场
  • 【Spring】——事务、整合、注解
  • 设计模式-观察者模式(发布订阅模式)
  • UE5 - 制作《塞尔达传说》中林克的技能 - 17 - 遥控炸弹(二)
  • 键盘第一下无反应
  • 基于Spring Boot的绿园社区团购系统的设计与实现