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:纵坐标

 

 效果:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/928539.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

后端-一对一的数据封装的两种写法对比

方式一特点&#xff1a;上面的普通封装可以删掉&#xff0c;也可以留着。 注意⚠️&#xff1a;下面的特殊封装的property的值是属性.字段。&#xff08;category.id...) column是sql重命名之后的字段&#xff0c;如果没有重命名是数据库中的值。 方式二特点&#xff1a;上面的…

CTF之密码学(密码特征分析)

一.MD5,sha1,HMAC,NTLM 1.MD5&#xff1a;MD5一般由32/16位的数字(0-9)和字母(a-f)组成的字符串 2.sha1&#xff1a;这种加密的密文特征跟MD5差不多&#xff0c;只不过位数是40&#xff08;sha256&#xff1a;64位&#xff1b;sha512:128位&#xff09; 3.HMAC&#xff1a;这…

网络安全框架及模型-PPDR模型

网络安全框架及模型-PPDR模型 概述: 为了有效应对不断变化的网络安全环境,人们意识到需要一种综合性的方法来管理和保护网络安全。因此,PPDR模型应运而生。它将策略、防护、检测和响应四个要素结合起来,提供了一个全面的框架来处理网络安全问题。 工作原理: PPDR模型的…

QT6学习第八天 QFrame 类

QT6学习第八天 QFrame 类族QLabel 标签部件按钮部件QLineEdit 行编辑器部件QAbstractSpinBoxQAbstractSlider 今天来学一学 QFrame 类。 QFrame 类族 QFrame 类是带有边框的部件的基类。它的子类包括常用的标签部件 QLabel、以及 QLCDNumber、QSplitter、QStackedWidget、QToo…

c++预编译头文件

文章目录 c预编译头文件1.使用g编译预编译头文件2.使用visual studio进行预编译头文件2.1visual studio如何设置输出预处理文件&#xff08;.i文件&#xff09;2.2visual studio 如何设置预编译&#xff08;初始创建空项目的情况下&#xff09;2.3 visual studio打开输出编译时…

简单快速的上手python

前言 python是一门可以快速上手的语言&#xff0c;原因是它语法简单&#xff0c;api容易使用自由灵活 当我们需要安装任何的三方库时&#xff0c;只需要执行 pip install XX 之后在代码里面import xxx就可以使用python啦。 并且python的代码自由灵活&#xff0c;使用缩进区…

【NLP高频面题 - LLM架构篇】旋转位置编码RoPE相对正弦位置编码有哪些优势?

【NLP高频面题 - LLM架构篇】旋转位置编码RoPE相对正弦位置编码有哪些优势&#xff1f; 重要性&#xff1a;⭐⭐⭐ &#x1f4af; NLP Github 项目&#xff1a; NLP 项目实践&#xff1a;fasterai/nlp-project-practice 介绍&#xff1a;该仓库围绕着 NLP 任务模型的设计、训练…

论文:IoU Loss for 2D/3D Object Detection

摘要&#xff1a;在2D/3D目标检测任务中&#xff0c;IoU (Intersection-over- Union)作为一种评价指标&#xff0c;被广泛用于评价不同探测器在测试阶段的性能。然而&#xff0c;在训练阶段&#xff0c;通常采用常见的距离损失(如L1或L2)作为损失函数&#xff0c;以最小化预测值…

STM32 HAL库开发学习1.STM32CubeMX 新建工程

STM32 HAL库开发学习1.STM32CubeMX 新建工程 一、 STM32 CubeMX 下载二、CubeMX 功能介绍1. 固件包路径设置2. 新建工程 三、创建项目实例1. 新建项目2. GPIO 管脚设置3. GPIO 窗口配置4. 调试设置5. 时钟配置6. 项目管理&#xff08;1&#xff09;项目信息&#xff08;2&#…

Qt的定时器应用案例 || Qt的图片添加显示

目录 1.ui界面 2.头文件 3.cpp源文件 4.main文件 5.关于ui_mytimerevent.h的代码编译错误 6.图片的添加展示方式 7.结果展示 8.参考文章 1.ui界面 2.头文件 #ifndef MYTIMEREVENT_H #define MYTIMEREVENT_H#include <QMainWindow> #include <QTime> //#in…

Linux中的常用基本指令(下)

Linux常用基本指令 Linux中的基本指令12.head指令13.tail指令简单解释重定向与管道(重要) 14.date指令(时间相关的指令)15.cal指令(不重要)16.find指令(灰常重要&#xff09;17.grep指令(重要)18.which指令和alias指令19.zip/unzip指令&#xff1a;20.tar指令&#xff08;重要&…

元素「宽高比」完美适配的方案

在日常生活中&#xff0c;我们常常会看到视频或照片能够随着页面尺寸变化&#xff0c;按照自身宽高比进行缩放调整。这种效果是如何实现的呢&#xff1f; 可以通过 CSS 和 JavaScript 两种方式完成&#xff0c;其中 CSS 是比较推荐的方式&#xff0c;因为它能充分利用现代浏览…

Android笔记【12】脚手架Scaffold和导航Navigation

一、前言 学习课程时&#xff0c;对于自己不懂的点的记录。 对于cy老师第二节课总结。 二、内容 1、PPT介绍scaffold 2、开始代码实操 先新建一个screen包&#xff0c;写一个Homescreen函数&#xff0c;包括四个页面。 再新建一个compenent包&#xff0c;写一个displayText…

[极客大挑战 2019]HardSQL--详细解析

信息搜集 登录系统&#xff0c;有两个可能的注入点&#xff1a; 随便输一下看看传参类型&#xff1a; 都是GET型。 SQL注入 传参 usernameadmin’&password123 传参 usernameadmin&password123’ username和password传参&#xff0c;四种闭合方式只有单引号报错&a…

Ansible自动化一键部署单节点集群架构

自动化部署利器&#xff1a;Ansible 一键部署脚本 在现代IT基础设施管理中&#xff0c;Ansible以其简洁、强大的自动化能力脱颖而出。以下是精心打造的Ansible自动化一键部署脚本&#xff0c;旨在简化部署流程&#xff0c;提升效率&#xff0c;确保一致性和可靠性。 通过这个…

基于云模型的车辆行驶速度估计算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于云模型的车辆行驶速度估计算法matlab仿真。在智能交通系统中&#xff0c;车辆行驶速度的准确估计对于交通流量监测、安全预警、自动驾驶辅助等方面具有极为重…

C++知识整理day3类与对象(下)——赋值运算符重载、取地址重载、列表初始化、友元、匿名对象、static

文章目录 1.赋值运算符重载1.1 运算符重载1.2 赋值运算符重载 2.取地址重载2.1 const成员函数2.2 取地址运算符重载 3.类与对象的补充3.1 再探构造函数---初始化列表3.2 类型转换3.3 static成员3.4 友元3.5 内部类3.6 匿名对象3.7 对象拷贝时的编译器优化 1.赋值运算符重载 赋…

自然语言处理:基于BERT预训练模型的中文命名实体识别(使用PyTorch)

命名实体识别&#xff08;NER&#xff09; 命名实体识别&#xff08;Named Entity Recognition, NER&#xff09;是自然语言处理&#xff08;NLP&#xff09;中的一个关键任务&#xff0c;其目标是从文本中识别出具有特定意义的实体&#xff0c;并将其分类到预定义的类别中。这…

面试题-RocketMQ的基本架构、支持的消息模式、如何保证消息的可靠传输

相关问题 1、RocketMQ的基本架构是怎样的&#xff1f;请简述各组件的作用。 2、RocketMQ支持哪几种消息模式&#xff08;如点对点、发布/订阅&#xff09;&#xff1f;请简要说明它们的区别。 3、如何使用Java客户端实现一个简单的消息生产者和消费者&#xff1f; 4、RocketMQ…

【力扣】3274. 检查棋盘方格颜色是否相同

一、题目 给你两个字符串 coordinate1 和 coordinate2&#xff0c;代表 8 x 8 国际象棋棋盘上的两个方格的坐标。以下是棋盘格的参考图&#xff1a; 如果这两个方格颜色相同&#xff0c;返回 true&#xff0c;否则返回 false。坐标总是表示有效的棋盘方格。坐标的格式总是先字…