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

Qt-界面优化QSS

QSS介绍

先说下CSS:

在⽹⻚前端开发领域中, CSS 是⼀个⾄关重要的部分. 描述了⼀个⽹⻚的 "样式". 从⽽起到对⽹⻚美化的作⽤。

Qt 仿照 CSS 的模式, 引⼊了 QSS, 来对 Qt 中的控件做出样式上的设定 。

CSS的功能很强大,QSS要逊色一些,但是也能完成很多工作。

QSS基础语法 

选择器 {属性名: 属性值; 
}

其中:

选择器 描述了 "哪个 widget 要应⽤样式规则".
属性 则是⼀个键值对, 属性名表⽰要设置哪种样式, 属性值表⽰了设置的样式的值

使用示例:
上述代码 将按钮的文本通过QSS设置成为红色

演示:

并且上述代码中,我们只针对了这一个控件以及它的子控件生效,如果有其它按钮则不会影响其它的。

QSS 设置⽅式 

指定控件设置样式 

 在刚刚演示的代码中,我们只针对那一个按钮以及它的子控件生效。比如当我们再创建一个按钮时:

此时我们给Widget设置同样的样式:
 演示:

可以看到,在Widget的子控件中属于QPushButton类的对象的文本都变成了红色。

设置全局样式 

可以通过 QApplication setStyleSheet ⽅法设置整个程序的全局样式 

设置全局样式的优点:

使同⼀个样式针对多个控件⽣效, 代码更简洁.
所有控件样式内聚在⼀起, 便于维护和问题排查

演示:

样式的层叠特性 

这里这个问题:

如果设置了全局样式,同时又对某个控件设置了其它的样式,此时样式不冲突,会咋样?

比如在全局样式中我们设置文本为红色,然后又对某个样式的字体大小进行了设置。

 

运行效果:

可见,此时它们的样式就叠加起来了。这种叠加的效果成为“层叠性”。

样式的优先级 

如果全局样式, 和指定控件样式冲突, 则指定控件样式优先展⽰ 

比如我们在全局设置文本颜色为红色,然后再把第一个按钮的颜色设置为蓝色

 演示:

在 CSS 中也存在类似的优先级规则. 通常来说都是 "局部" 优先级⾼于 "全局" 优先级.
相当于全局样式先 "奠定基调" , 再通过指定控件样式来 "特事特办"

样式代码和C++代码分离 

在之前的演示中,我们的样式代码和C++代码是混合在一起的。

当我们的QSS代码非常复杂时,如果还是这样编写,那么代码的维护成本就会变得很高。

那么我们就可以专门把样式代码拎出来,放到一个文件中,后续让C++代码读取并加载文件内容。

我们同样可以用qrc管理样式文件:

但是这个方法仅供参考,因为实际开发中还有更简单的方案。

在Qt Designer中,我们可以直接把样式写入.ui文件中。

 

点击确定后

在Qt Designer中就直接生效了。

设置方式总结
 

由于样式的设置非常灵活,很多地方都能设置,这就导致当某个控件的样式不符合预期时,排查起来就比较麻烦。

因此,在实际开发中,建议使用某一种统一的方式来设置样式。

选择器 

QSS 的选择器⽀持以下⼏种

示例:

类选择器 

先看看类型选择器,它是会选择子控件的:

接着我们改为类选择器,这样就不会选择子控件了。

 

 id选择器

演示:

这个例子发现:

当某个控件⾝上, 通过类型选择器和 ID 选择器设置了冲突的样式时, ID 选择器样式优先级更⾼

实践中我们可以简单的认为, 选择器描述的范围越精准, 则优先级越⾼. ⼀般来说, ID 选择器优
先级是最⾼的

子控件选择器 

有些控件内部包含了多个 "⼦控件" . ⽐如 QComboBox 的下拉后的⾯板, ⽐如 QSpinBox 的上下按钮等

可以通过⼦控件选择器 :: , 针对上述⼦控件进⾏样式设置 

设置下拉框的下拉按钮样式 

先设置一个下拉框 

 我也提前准备好了一个down的图片

使⽤⼦控件选择器 QComboBox::down-arrow 选中了 QComboBox 的下拉按钮.
再通过 image 属性设置图⽚

 效果

伪类选择器 (Pseudo-States) 

伪类选择器, 是根据控件所处的某个状态被选择的. 例如按钮被按下, 输⼊框获取到焦点, ⿏标移动到某个控件上等.

当状态具备时, 控件被选中, 样式⽣效.
当状态不具备时, 控件不被选中, 样式失效.
使⽤ : 的⽅式定义伪类选择器

前面介绍的选择器,都是选中控件。

 伪类选择器它选中的是控件的状态。

常见的伪类选择器

这些状态可以使⽤ ! 来取反. ⽐如 :!hover 就是⿏标离开控件时, :!pressed 就是⿏标松开时, 等等

 设置按钮的伪类样式

如上,按钮的文本设置为红色,当鼠标放置到按钮上时,变为绿色,鼠标按下时,变为蓝色

用事件也可以达到类似的效,但是相比之下就复杂许多。

 需要我们设计一个类,这个类继承自QPushButton,然后重写四个事件处理函数:
 

class MyPushButton : public QPushButton
{
public:MyPushButton(QWidget* parent);void mousePressEvent(QMouseEvent* e);void mouseReleaseEvent(QMouseEvent* e);void enterEvent(QEvent* e);void leaveEvent(QEvent* e);
};

这里就不过多演示了。

这里看似事件复杂许多,但是事件可以完成的功能不仅仅是改变样式,这一点是伪类选择器无法替代的。

 样式属性

盒模型 (Box Model) 

盒子模型来自CSS。

可以把每个QWidget想象成这样一个矩形。 

⼀个遵守盒模型的控件, 由上述⼏个部分构成.
Content 矩形区域: 存放控件内容. ⽐如包含的⽂本/图标等.
Border 矩形区域: 控件的边框.
Padding 矩形区域: 内边距. 边框和内容之间的距离.
Margin 矩形区域: 外边距. 边框到控件 geometry 返回的矩形边界的距离

可以通过⼀些 QSS 属性来设置上述的边距和边框的样式. 

 关于margin和padding的复合属性:

 示例:

设置一个文本的边框和内边距

默认是这样的:

其中:

border: 5px solid red 相当于 border-style: solid; border-width: 5px; border-color: red; 三个属性的简写形式.
padding-left: 10px; 是给左侧设置内边距

 设置外边距

为了⽅便确定控件位置, 演⽰外边距效果, 我们使⽤代码创建⼀个按钮 

效果:

 演示效果:

 

可以看到, 当前按钮的边框被外边距挤的缩⼩了. 但是获取到的按钮的 Geometry 是不变的

控件样式⽰例 

按钮 

比如对于一个按钮:

关于上述的一些属性:

形如 #dadbde 是计算机中通过⼗六进制表⽰颜⾊的⽅式 

复选框 

准备了两个复选框

一个给复选框未选中的时候用,另一个给·选中的时候用。

在qrc中添加进去后记得保存,这样我们就可以在Qt Designer中直接用。

演示效果:

 另外,关于这个伪类选择器也是有很多情况的:

比如当鼠标放到indicator上时,又分为indicator是否被选中的情况。在上述例子中,如果它被选中了,那么鼠标放上去的情况就是绿色的,反之就是红色的。 

 上述例子中的一些要点:

QSS 中有些属性, ⼦元素能继承⽗元素(例如 font-size, color 等). 但是也有很多属性是不能继
承的

还有一些单选框的例子就不一一举例了。

输入框 

 演示效果:

上述的一些属性:

列表(设置渐变色)

 先创建一个QListWidget

设置渐变色需要用到qlineargradient这个函数。它有6个参数。

先看使用示例:

演示效果:

关于 qlineargradient的参数:

关于它们参数的取值只能选取0或者1。

其中x1:起点的横坐标   y1:起点的纵坐标

x2:重点的横坐标,y2:重点的纵坐标。

0和1的组合可以表示一个矩形的四个角:

例如:
x1: 0, y1: 0, x2: 0, y2: 1 就是垂直⽅向从上向下 进⾏颜⾊渐变.
x1: 0, y1: 0, x2: 1, y2: 0 就是⽔平⽅向从左向右 进⾏颜⾊渐变.
x1: 0, y1: 0, x2: 1, y2: 1 就是从左上往右下⽅向 进⾏颜⾊渐变.
stop0 和 stop1 描述了两个颜⾊. 渐变过程就是从 stop0 往 stop1 进⾏渐变的

 示例:
垂直从上往下由白色渐变到黑色

菜单栏 

 

 

 

 美化登录界面

初始登录界面:
 

另外,我们想给这个登录界面套一个背景图片

顶层窗⼝的 QWidget ⽆法设置背景图⽚. 因此我们需要再套上⼀层 QFrame. 背景图⽚就设置
到 QFrame 上即可

 

 

用qrc导入图片

使⽤ border-image 设置背景图⽚, ⽽不是 background-image . 主要是因为 border
image 是可以⾃动缩放的. 这⼀点在窗⼝⼤⼩发⽣改变时是⾮常有意义的.

 

效果:
 

接着设置输入框样式:

QLineEdit{
color: #8d98a1;
background-color: #405361;
padding: 0 5px;
font-size: 20px;
border-style: none;
border-radius: 15px;
}

 效果:

设置 checkbox 样式 

背景⾊使⽤ transparent 表⽰完全透明 (应⽤⽗元素的背景) 

 

 效果:

设置按钮样式 

 

效果:
 

 

最终效果:

 

 

Qt绘图 

 

虽然 Qt 已经内置了很多的控件, 但是不能保证现有控件就可以应对所有场景.
很多时候我们需要更强的 "⾃定制" 能⼒.
Qt 提供了画图相关的 API, 可以允许我们在窗⼝上绘制任意的图形形状, 来完成更复杂的界⾯设计

 

所谓的 "控件" , 本质上也是通过画图的⽅式画上去的.
画图 API 和 控件 之间的关系, 可以类⽐成机器指令和⾼级语⾔之间的关系.
控件是对画图 API 的进⼀步封装; 画图 API 是控件的底层实现

 

绘图 API 核⼼类 

 绘图 API 的使⽤, ⼀般不会在 QWidget 的构造函数中使⽤, ⽽是要放到 paintEvent 事件中.

 

关于 paintEvent
paintEvent 会在以下情况下被触发:
控件⾸次创建.
控件被遮挡, 再解除遮挡.
窗⼝最⼩化, 再恢复.
  窗⼝最⼩化, 再恢复.
控件⼤⼩发⽣变化时.
主动调⽤ repaint() 或者 update() ⽅法. (这两个⽅法都是 QWidget 的⽅法).

 

 

 

 

 

 

绘制一个线段 

void drawLine(const QPoint &p1, const QPoint &p2);参数:p1:绘制起点坐标p2:绘制终点坐标

 1.在 "widget.h" 头⽂件中声明绘图事件

2.重写这个函数

包含头文件#include <QPainter>

 效果:

 

绘制一个矩形 

void QPainter::drawRect(int x, int y, int width, int height);
参数:x:窗⼝横坐标;y:窗⼝纵坐标;width:所绘制矩形的宽度;height:所绘制矩形的⾼度;

 

效果:
 

绘制一个圆形 

void QPainter::drawEllipse(const QPoint &center, int rx, int ry)
参数:center:中⼼点坐标rx:横坐标ry:纵坐标

 

 效果:

 

相关文章:

Qt-界面优化QSS

QSS介绍 先说下CSS&#xff1a; 在⽹⻚前端开发领域中, CSS 是⼀个⾄关重要的部分. 描述了⼀个⽹⻚的 "样式". 从⽽起到对⽹⻚美化的作⽤。 Qt 仿照 CSS 的模式, 引⼊了 QSS, 来对 Qt 中的控件做出样式上的设定 。 CSS的功能很强大&#xff0c;QSS要逊色一些&#…...

QT实战-qt各种菜单样式实现

本文主要介绍了qt普通菜单样式、带选中样式、带子菜单样式、超过一屏幕菜单样式、自定义带有滚动条的菜单样式&#xff0c; 先上图如下&#xff1a; 1.普通菜单样式 代码&#xff1a; m_pmenu new QMenu(this);m_pmenu->setObjectName("quoteListMenu"); qss文…...

深度学习基础03_BP算法(下)过拟合和欠拟合

目录 一、BP算法(下) 0、反向传播代码回顾 写法一&#xff1a; 写法二(更常用)&#xff1a; 1、BP中的梯度下降 1.数学描述 2.传统下降方式 3.优化梯度下降方式 指数加权平均 Momentum AdaGrad RMSProp Adam(常用) 总结 二、过拟合和欠拟合 1、概念 1.过拟合 …...

web vue 滑动选择 n宫格选中 九宫格选中

页面动态布局经常性要交给客户来操作&#xff0c;他们按时他们的习惯在同一个屏幕内显示若干个子视图&#xff0c;尤其是在医学影像领域对于影像的同屏显示目视对比显的更为重要。 来看看如下的用户体验&#xff1a; 设计为最多支持5行6列页面展示后&#xff0c;右侧的布局则动…...

Spring Boot整合EasyExcel

Spring Boot整合EasyExcel主要涉及到以下几个步骤&#xff1a; 1.添加EasyExcel依赖到Spring Boot项目的pom.xml文件中。 2.创建数据模型类&#xff0c;用于映射Excel文件中的数据。 3.编写读取和写入Excel的服务。 以下是一个简单的例子&#xff1a; 1.添加EasyExcel依赖 …...

微软表示不会使用你的 Word、Excel 数据进行 AI 训练

​微软否认使用 Microsoft 365 应用程序&#xff08;包括 Word、Excel 和 PowerPoint&#xff09;收集数据来训练公司人工智能 (AI) 模型的说法。 此前&#xff0c;Tumblr 的一篇博文声称&#xff0c;雷德蒙德使用“互联体验”功能抓取客户的 Word 和 Excel 数据&#xff0c;用…...

JavaScript(一)

1.JavaScript 基本使用 2.JavaScript简单事件 3.JavaScript修改样式 4.JavaScript数据类型 JavaScript和Java有什么关系 知识点一 JavaScript基本使用 JS写在哪 还有一种写在中间的&#xff0c;也就是<head>里面 JS一些注意事项 JS修改元素内容 #JS获取对象<…...

Day 32 动态规划part01

今天正式开始动态规划! 理论基础 无论大家之前对动态规划学到什么程度,一定要先看 我讲的 动态规划理论基础。 如果没做过动态规划的题目,看我讲的理论基础,会有感觉 是不是简单题想复杂了? 其实并没有,我讲的理论基础内容,在动规章节所有题目都有运用,所以很重要!…...

winform跨线程更新界面

前言&#xff1a; 大家好&#xff0c;我是上位机马工&#xff0c;硕士毕业4年年入40万&#xff0c;目前在一家自动化公司担任软件经理&#xff0c;从事C#上位机软件开发8年以上&#xff01;我们在开发C#程序的时候&#xff0c;有时候需要在非Ui主线程更新界面&#xff0c;为了…...

【合作原创】使用Termux搭建可以使用的生产力环境(二)

前言 上期文章没看的可以先从上期文章开始看起 【合作原创】使用Termux搭建可以使用的生产力环境&#xff08;一&#xff09;-CSDN博客 目前我们已经完成了FinalShell ssh连接手机Termux的功能了&#xff0c;这期我们继续朝我们的目标前进。今天早上有读者进群以为生成环境指…...

微积分复习笔记 Calculus Volume 2 - 3.3 Trigonometric Substitution

3.3 Trigonometric Substitution - Calculus Volume 2 | OpenStax...

vue2+svg+elementui实现花瓣图自定义el-select回显色卡图片

项目需要实现花瓣图&#xff0c;但是改图表在echarts&#xff0c;highCharts等案例中均未出现&#xff0c;有类似的韦恩图&#xff0c;但是和需求有所差距&#xff1b; 为实现该效果&#xff0c;静态图表上采取svg来手动绘制花瓣&#xff1a; 确定中心点&#xff0c;以该点为中…...

记录一次网关异常

记一次网关异常 网关时不时就会出现下面的异常。关键是不知道什么时候就会报错&#xff0c;并且有时候就算什么都不操作&#xff0c;也会导致这个异常。 ERROR org.springframework.scheduling.support.TaskUtils$LoggingErrorHandler - Unexpected error occurred in schedul…...

计算机网络——不同版本的 HTTP 协议

介绍 HTTP&#xff0c;即超文本传输协议&#xff08;HyperText Transfer Protocol&#xff09;&#xff0c;是应用层的一个简单的请求-响应协议&#xff0c;它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。本文将介绍 HTTP 协议各个版本。 HTTP/1.0 HTTP/1…...

使用 LLaMA-Factory 微调

git clone https://github.com/hiyouga/LLaMA-Factory.git cd LLaMA-Factory pip install -e . pip install tf-keras[dataset_info.json](dataset_info.json) 包含了所有可用的数据集。如果您希望使用自定义数据集&#xff0c;请**务必**在 dataset_info.json 文件中添加*数据…...

vue2 虚拟DOM 和 真实DOM (概念、作用、Diff 算法)

虚拟 DOM 和 真实DOM&#xff08;概念、作用、Diff 算法&#xff09; 1.1 概念 真实 DOM&#xff08;Document Object Model&#xff09;&#xff1a;是浏览器中用于表示文档结构的树形结构。 <h2>你好</h2>虚拟DOM&#xff1a;用 JavaScript 对象来模拟真实 DOM…...

GEOBench-VLM:专为地理空间任务设计的视觉-语言模型基准测试数据集

2024-11-29 ,由穆罕默德本扎耶德人工智能大学等机构创建了GEOBench-VLM数据集&#xff0c;目的评估视觉-语言模型&#xff08;VLM&#xff09;在地理空间任务中的表现。该数据集的推出填补了现有基准测试在地理空间应用中的空白&#xff0c;提供了超过10,000个经过人工验证的指…...

说说Elasticsearch查询语句如何提升权重?

大家好&#xff0c;我是锋哥。今天分享关于【说说Elasticsearch查询语句如何提升权重&#xff1f;】面试题。希望对大家有帮助&#xff1b; 说说Elasticsearch查询语句如何提升权重&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Elasticsearch 中&…...

2-2-18-9 QNX系统架构之文件系统(一)

阅读前言 本文以QNX系统官方的文档英文原版资料为参考&#xff0c;翻译和逐句校对后&#xff0c;对QNX操作系统的相关概念进行了深度整理&#xff0c;旨在帮助想要了解QNX的读者及开发者可以快速阅读&#xff0c;而不必查看晦涩难懂的英文原文&#xff0c;这些文章将会作为一个…...

Unity类银河战士恶魔城学习总结(P156 Audio Settings音频设置)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址&#xff1a;https://www.udemy.com/course/2d-rpg-alexdev/ 本章节实现了音频的大小设置与保存加载 音频管理器 UI_VolumeSlider.cs 定义了 UI_VolumeSlider 类&#xff0c;用于处理与音频设置相关的…...

2025_NIPS_JavisGPT: A Unified Multi-modal LLM for Sounding-Video Comprehension and Generation

JavisGPT 论文核心总结与翻译 一、主要内容总结 JavisGPT 是首个面向同步音视频(sounding video)理解与生成的统一多模态大语言模型(MLLM),核心解决现有模型将音视频视为独立模态、缺乏时空同步建模的问题。 模型采用编码器-LLM-解码器架构,以 Qwen2.5-VL-7B-Instruct…...

华为2288X V5服务器RAID配置实战:为iMaster NCE-CampusInsight单机部署打好地基

华为2288X V5服务器RAID配置全攻略&#xff1a;从硬件准备到iMaster NCE-CampusInsight部署 当企业级网络分析平台iMaster NCE-CampusInsight遇上华为2288X V5服务器&#xff0c;硬件配置的合理性直接决定了后续系统运行的稳定性与数据安全性。作为部署流程中的首个技术攻坚点&…...

瑞芯微Linux驱动工程师面试技术要点解析

1. 瑞芯微Linux驱动工程师面试全解析 作为一名在嵌入式Linux领域摸爬滚打多年的老司机&#xff0c;今天想和大家分享一份瑞芯微社招Linux驱动工程师的真实面经。不同于网上那些泛泛而谈的面试技巧&#xff0c;这份面经完全基于实际项目经验展开&#xff0c;可以说是"写什么…...

玉米脱粒机的毕业设计(论文+12张CAD图纸+开题报告+任务书……)

玉米脱粒机作为农业机械化的重要设备&#xff0c;其核心作用在于通过机械结构与动力系统的协同&#xff0c;实现玉米果穗与籽粒的高效分离。传统人工脱粒效率低、劳动强度大&#xff0c;而机械化脱粒通过旋转滚筒与筛网的配合&#xff0c;可显著提升处理速度&#xff0c;同时降…...

AI 输出 Token 优化:文言文极简模式的实践

AI 输出 Token 优化&#xff1a;文言文极简模式的实践在 AI 应用开发中&#xff0c;token 消耗直接影响成本。HagiCode 项目通过 SOUL 系统实现了"文言文极简输出模式"&#xff0c;在不损失信息密度的前提下&#xff0c;将输出 token 降低约 30-50%。本文分享这套方案…...

保姆级教程:在CentOS 7.9上从源码编译安装nvtop 3.1.0(含CMake 3.29.7依赖安装)

在CentOS 7.9上从源码构建GPU监控神器nvtop 3.1.0的全流程指南 当你面对一台运行CentOS 7.9的老旧服务器&#xff0c;需要实时监控NVIDIA、AMD或Intel GPU的运行状态时&#xff0c;nvtop无疑是最佳选择之一。这款类似htop的工具能直观展示GPU使用率、温度、显存占用等关键指标&…...

从Logistic曲线到疫情预测:用Python和SciPy复现SI传染病模型(附代码)

从Logistic曲线到疫情预测&#xff1a;用Python和SciPy复现SI传染病模型&#xff08;附代码&#xff09; 最近在整理疫情数据时&#xff0c;我发现一个有趣的现象&#xff1a;很多地区的感染人数增长曲线都呈现出典型的S型特征。这让我想起了经典的SI传染病模型&#xff0c;它用…...

7张图讲透Claude Code架构(非常详细),Harness设计从入门到精通,收藏这一篇就够了!

1. 整体概述 众所周知&#xff0c;Claude Code不仅仅是Coding产品&#xff0c;更是一个通用的终端Agent&#xff1a;能循环思考、调度工具、治理权限、恢复上下文、稳定长会话… 如何研读项目源码呢&#xff1f; 首先&#xff0c;我让AI帮着梳理了下目录架构和模块职责&…...

记录生活中的一件小事(佚名整理)

&#xff08;转发需官方授权&#xff09;记录生活中的一件小事&#xff08;佚名整理&#xff09;&#xff08;佚名整理&#xff09;记录生活中的一件小事&#xff0c;如果喊错了那才是麻烦事情的开始&#xff1a;曾经有一个人家里有两个姐姐&#xff0c;这个人上高中的时候和两…...

LLM之Agent(三十七)|AI Agents(六):从Workflow到Agent的架构演进与选型指南

1. 从Workflow到Agent的技术演进路径 十年前我刚接触自动化系统时&#xff0c;所有流程都是硬编码的if-else逻辑。如今AI技术的爆发式发展&#xff0c;让系统架构经历了三次重要迭代&#xff1a; 第一代规则引擎就像铁路轨道&#xff0c;每个岔路口都需要人工预设判断条件。我参…...