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

Qt中的QSS介绍

      QSS(Qt Style Sheets):Qt样式表,用于自定义定制Qt应用程序中部件(Widgets)的外观和样式,美化用户界面。它可以控制窗口、按钮、文本框等控件的颜色、字体、边框、背景等视觉属性。

      Qt样式表的术语和语法规则与HTML CSS几乎完全相同。样式表由一系列样式规则(style rules)组成。样式规则由选择器(selector)和声明组成。选择器指定哪些控件受该规则影响;声明指定应在控件上设置哪些属性。如下语句:QPushButton是选择器,{ color: red }是声明。该规则指定QPushButton及其子类应使用红色作为前景色。

QPushButton { color: red }

      1.Qt样式表通常不区分大小写(例如,color、Color、COLOR和cOloR指的是同一个属性)。唯一的例外是类名、对象名和Qt属性名,它们区分大小写。

      2.可以为同一个声明指定多个选择器,使用逗号(,)分隔选择器

      3.样式规则的声明部分是属性:值对的列表,用大括号({})括起来并用分号分隔

      4.子控件:要设置复杂控件的样式,需要访问控件的子控件,例如QComboBox的下拉按钮。选择器可以包含子控件,从而可以将规则的应用限制在特定的控件子控件上。如下语句:此规则为所有QComboBox的下拉按钮设置了样式。

QComboBox::drop-down {image: url(dropdown.png);subcontrol-origin: margin;
}

      5.伪状态(pseudo-states):选择器可以包含伪状态,用于根据控件的状态限制规则的应用伪状态位于选择器的末尾,中间用冒号(:)隔开。如下语句:当鼠标悬停在QPushButton上时,将应用此规则

QPushButton:hover { color: white }

      (1).伪状态可以用感叹号运算符来否定。如下语句:当鼠标未悬停在QRadioButton上时,将应用此规则:

QRadioButton:!hover { color: red }

      (2).伪状态可以链接(chained)使用,在这种情况下,逻辑上会隐含"与"关系。如下语句:当鼠标悬停在已选中的QCheckBox上时,将应用此规则:

QCheckBox:hover:checked { color: white }

      (3).伪状态链中可能会出现否定伪状态。如下语句:当鼠标悬停在未按下的QPushButton上时,将应用此规则:

QPushButton:hover:!pressed { color: blue; }

      (4).如果需要,可以使用逗号运算符来表达逻辑或,如下语句:

QCheckBox:hover, QCheckBox:checked { color: white }

      (5).伪状态可以与子控件组合使用,如下语句:

QComboBox::drop-down:hover { image: url(dropdown_bright.png) }

      6.冲突解决:当多条样式规则指定相同的属性但值不同时,就会发生冲突

      (1).如下语句:以下两个规则都匹配名为okButton的QPushButton实例,并且color属性存在冲突。QPushButton#okButton被认为比QPushButton更具体,因为它(通常)引用单个对象,而不是某个类的所有实例。因此okButton的前景色设置为gray而非red,其它设置为red。

QPushButton#okButton { color: gray }
QPushButton { color: red }

      (2).如下语句:带有伪状态的选择器比未指定伪状态的选择器更具体。因此,以下样式表指定QPushButton在鼠标悬停在其上时应显示白色文本,否则显示红色文本

QPushButton:hover { color: white }
QPushButton { color: red }

      7.样式表层叠(cascading):

      (1).样式表可以在QApplication、父级Widget和子Widget上设置。任意Widget的有效样式表都是通过合并Widget祖先(父级、祖级等)上设置的样式表以及 QApplication上设置的任何样式表来获得的。

      (2).当发生冲突时,无论冲突规则的具体性如何,Widget自身的样式表始终优先于任何继承的样式表。同样,父级Widget的样式表优先于祖级Widget的样式表,依此类推。

      8.继承:默认情况下,使用Qt样式表时,部件不会自动从其父级部件继承其字体和颜色设置。相反,使用QWidget::setFont()和QWidget::setPalette()设置字体和调色板会传递到子窗口部件。通过调用QWidget::setPalette()或QWidget::setFont()所做的更改会被继承。所有现有和未来的子窗口部件(如果相应的画笔或字体尚未明确设置)都会继承这些更改。

      注:以上内容主要来自于 Qt官方文档

      使用VS2022创建一个Qt Widgets Application项目,往QtWidgetsApplication1.ui上拖一些控件,然后直接运行,结果如下图所示:

      编写一个style.qss文件,内容如下所示:

QWidget {background-color: #87CEEB;
}
QTabBar::tab::selected {background: green;color: white;
}
QTabBar::tab:!selected {background: gray;color: white;
}
QPushButton:hover {color: red;
}
QLabel,QLineEdit {color: rgb(0,255,0);
}
QCheckBox:hover:checked {color: white
}
QRadioButton:hover{color: white
}
QRadioButton:checked {background-color: transparent;color: red;
}

      将style.qss加入到QtWidgetsApplication1.qrc中,如下图所示:

      调整main.cpp,内容如下:

int main(int argc, char *argv[])
{QApplication a(argc, argv);QFile style_file(":/styles/style.qss");if (style_file.open(QFile::ReadOnly)) {QTextStream stream(&style_file);QString style_content = stream.readAll();qDebug() << "qss length: " << style_content.length();a.setStyleSheet(style_content);style_file.close();}elseqDebug() << "failed to open style sheet file";//a.setStyleSheet("QPushButton:hover { color: red; }");QtWidgetsApplication1 w;w.show();return a.exec();
}

      重新编译运行,执行结果如下图所示:

      GitHub:https://github.com/fengbingchun/Qt_Test

http://www.xdnf.cn/news/19124.html

相关文章:

  • Time-MOE添加MLP分类头进行分类任务
  • 用户自定义字段(Custom Fields)设计方案,兼顾多语言、分组、校验、权限、查询性能、审计与多租户
  • 创维E910V10C_晶晨S905L2和S905L3芯片_线刷固件包
  • HDMI2.1 8K验证平台
  • 【拍摄学习记录】05-对焦、虚化、景深
  • 告别音色漂移!微软超长语音合成模型VibeVoice正式开源​
  • 数列寻方:等差数列和为完全平方数
  • MinIO社区版“背刺“之后:RustFS用Apache 2.0协议重构开源信任
  • Java接口和抽象类的区别,并举例说明
  • 【Spring Cloud Alibaba】前置知识(一)
  • LeetCode 01背包 494. 目标和
  • 2025_WSL2_Ubuntu20.04_C++20_concept 环境配置
  • AntSK知识库多格式导入技术深度解析:从文档到智能,一站式知识管理的技术奇迹
  • zyplayer-doc 开源知识库:部署与使用指南
  • 千年智造,一触即发 耐达讯自动化Profibus集线器如何让HMI触摸屏在工业4.0中“点石成金“?
  • 新人桌球笔记
  • Web前端入门:JavaScript 一个简单的 IndexedDB 数据库入门示例
  • 【开题答辩全过程】以 基于Vue Spring Boot的教师资格证考试助力系统设计与实现为例,包含答辩的问题和答案
  • QML Chart组件之坐标轴共有属性
  • AI人工智能系统搭建实战指南:常见陷阱与解决方案
  • 从零开始学习单片机17
  • PCIe 6.0的速度奥秘:数学视角下的编码革命与信号完整性突破
  • htb academy笔记-module-Penetration Testing Process(一)
  • Marin说PCB之POC电路layout设计仿真案例---11
  • 掌握 Linux 文件权限:chown 命令深度解析与实践
  • 【YOLO学习笔记】数据增强mosaic、Mixup、透视放射变换
  • LeetCode100-54螺旋矩阵
  • Edge浏览器新标签页加载慢
  • 零售行业全渠道应如何与零售后端系统集成?
  • Python 实战:内网渗透中的信息收集自动化脚本(5)