【QT】qss

news2024/11/15 19:40:02

目录

基本语法

设置全局样式 

问题

分离样式代码 

方案1

方案2

选择器

概况

子控件选择器

伪类选择器 

盒子模型

修改控件样式示例

按钮

属性小结

复选框

属性小结

输入框

属性小结 

列表框

属性小结

渐变色

示例:

菜单栏

设置菜单栏的背景色和各个菜单之间的间距

设置菜单的背景颜色和内边距

 设置选中菜单/点击菜单时背景颜色修改

设置菜单项之间的分割线样式

属性小结 

登录界面设计

最终效果

设置背景

设置输入框样式 

设置按钮样式

完整代码


基本语法

选择器{

        属性名:属性值;

}

选择器:先选择某个/某一类控件,接下来进行的各种属性设置,都是针对选中的控件生效的

设置全局样式 

界面上所有的样式都集中到一起来组织

在main.cpp中

int main(int argc, char *argv[])

{

    QApplication a(argc, argv);

    a.setStyleSheet("QPushButton {color:blue;}");

    Widget w;

    w.show();

    return a.exec();

}

问题

如果设置了全局样式,然后在某个控件里又设置了 其他样式,会怎么样?

如果全局样式与局部样式不冲突的话,两者的样式效果会叠加起来 ,也就是层叠性

如果设置了全局样式,在某个控件里设置的样式和全局样式冲突了,会怎么样?

如果全局样式与局部样式冲突的话,局部样式的优先级是更高的,覆盖了对应的全局样式。

分离样式代码 

方案1

  1. 创建qrc文件,通过qrc管理样式文件
  2. 创建单独的qss文件,把这样的文件放到qrc中
  3. 编写c++代码,读取qss文件中的内容,并设置样式

代码如下:

#include "widget.h"

#include <QApplication>
#include <QFile>

QString loadQSS()
{
   QFile file(":/style.qss");
   file.open(QFile::ReadOnly);
   QString style = file.readAll();
   file.close();
   return style;
}
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    a.setStyleSheet(loadQSS());
    Widget w;
    w.show();
    return a.exec();
}

方案2

在Qt Designer 中集成了这样的功能,允许我们把样式直接写到.ui文件中。

通过点击如下所示的“改变样式表”,在这里设置样式还能实时预览效果。

 综上所述,由于设置样式的方式太灵活了,有很多地方都能设置,就导致当某个控件样式不符合预期的时候,排查起来就比较麻烦。在实际开发中,建议统一使用某一种方式来设置样式。

选择器

概况

qss的选择器支持以下几种:

选择器示例说明
全局选择器
*
选择所有的 widget.
类型选择器 (type
selector)
QPushButton
选择所有的 QPushButton 和 其子类 的控件.
类选择器 (class selector)
.QPushButton
选择所有的 QPushButton 的控件. 不会选择子类.
ID 选择器
#pushButton_2
选择 objectName pushButton_2 的控 件.
后代选择器
QDialog QPushButton
选择 QDialog 的所有后代(⼦控件, 孙⼦控件等等) 中的 QPushButton.
⼦选择器
QDialog > QPushButton
选择 QDialog 的所有⼦控件中的QPushButton
并集选择器
QPushButton, QLineEdit,
QComboBox
选择 QPushButton, QLineEdit, QComboBox 这三种控件. (即接下来的样式会针对这三种控件都⽣效)
属性选择器
QPushButton[flat="false"
选择所有 QPushButton 中, flat 属性为 false 的控件.
  • 这里要区分类型选择器和类选择器,一个会包含其子类,一个不包含。
  • id选择器中的id为控件的ObjectName

  • 当 类型选择器和id选择器选中同一控件,并且设置的样式是冲突的,此时id选择器的优先级更高。

子控件选择器

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

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

首先我们可以通过qt帮助文档,来查看有哪些子控件,和他们属于哪个控件

示例:修改下拉框的下拉按钮样式

#include "widget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QString style = "QComboBox::down-arrow{image:url(:/down_row.png);}";
    a.setStyleSheet(style);
    Widget w;
    w.show();
    return a.exec();
}

效果如下:

伪类选择器 

伪类选择器,选中的是控件的“状态”,“符合一定状态条件”的控件。

也就是说

  • 当状态具备时,控件被选中,样式生效
  • 当状态不具备时,控件不被选中,样式失效

使用  :的方式定义伪类选择器

常用的伪类选择器

伪类选择器说明
:hover
⿏标放到控件上
:pressed
⿏标左键按下时
:focus
获取输⼊焦点时
:enabled
元素处于可⽤状态时
:checked
被勾选时
:read-only
元素为只读状态时
        这些状态可以使用 ! 来取反. 比如 :!hover 就是⿏标离开控件时, :!pressed 就是⿏标松开时,
等等。
        更多的伪类选择器,可以查看qt助手

示例:鼠标悬停字体变红,点击变蓝

    QString style = "QPushButton:hover{color:red;}";
    style+="QPushButton:pressed{color:blue;}";
    a.setStyleSheet(style);

盒子模型

box model

⼀个遵守盒模型的控件, 由上述⼏个部分构成.

  • Content 矩形区域: 存放控件内容. ⽐如包含的⽂本/图标等.
  • Border 矩形区域: 控件的边框.
  • Padding 矩形区域: 内边距. 边框和内容之间的距离.
  • Margin 矩形区域: 外边距. 边框到控件 geometry 返回的矩形边界的距离

默认情况下, 外边距, 内边距, 边框宽度都是 0,这与css中的盒模型基本类似

属性说明
margin
设置四个方向的外边距. 复合属性.
padding
设置四个方向的内边距. 复合属性.
border-style
设置边框样式
border-width
边框的粗细
border-color
边框的颜⾊
border
复合属性, 相当于 border-style + border-width + border-color

修改控件样式示例

按钮

        这里区分color和background-color属性,color设置的是字体的属性,background-color设置的是背景颜色。

QPushButton{
	font-size:20px;
	boder:2px solid rgb(171, 165, 255);
	boder-radius:15px;
	background-color:rgb(237, 213, 255);
	color:white;
}
QPushButton:pressed{
	background-color:rgb(156, 110, 255);
}

属性小结

属性说明
font-size
设置文字大小
border-radius
设置圆⻆矩形
数值设置的越大, 角就 "越圆"
background-color
设置背景颜色

复选框

这里设置复选框未选中、未选中鼠标悬停、勾选时的图标

QCheckBox{
	font-size:20px;
}
QCheckBox::indicator{
	width:20px;
	height:20px;
}
QCheckBox::indicator:unchecked{
	image:url(:/checkbox_uncheck.png);
}
QCheckBox::indicator:unchecked:hover{
	image:url(:/checkbox.png);
}
QCheckBox::indicator:checked{
	image:url(:/checkbox_check.png)
}

属性小结

要点说明
::indicator
⼦控件选择器.
选中 checkbox 中的对钩部分.
:hover

伪类选择器.

中⿏标移动上去的状态.

:pressed
伪类选择器.
选中⿏标按下的状态.
:checked
伪类选择器.
选中 checkbox 被选中的状态.
:unchecked
伪类选择器.
选中 checkbox 未被选中的状态.
width
设置⼦控件宽度.
对于普通控件⽆效 (普通控件使⽤ geometry 方式设定尺⼨).
height
设置⼦控件⾼度.
对于普通控件⽆效 (普通控件使⽤ geometry 方式设定尺⼨)
image
设置⼦控件的图⽚.
像 QSpinBox, QComboBox 等可以使⽤这个属性来设置⼦控件的图⽚

单选框的设置与复选框类似,两者涉及属性基本上一样,这里就不再介绍。

输入框

QLineEdit{
	border-width:1px;
	border-radius:10px;
	border-color:rgb(148, 255, 252);
	border-style:inset;
	padding:0 8px;
	color:rgb(255, 255, 255);
	background:rgb(100, 100, 100);
	selection-background-color:rgb(255, 255, 0);
	selection-color:rgb(121, 121, 121);	
}

属性小结 

属性说明
border-width
设置边框宽度
border-radius
设置边框圆⻆
border-color
设置边框颜⾊
border-style
设置边框⻛格
padding
设置内边距
color
设置⽂字颜⾊
background
设置背景颜⾊
selection-background-color
设置选中⽂字的背景颜⾊
selection-color
设置选中⽂字的⽂本颜⾊

列表框

属性小结

属性说明
::item
选中 QListView 中的具体条⽬
:hover
选中⿏标悬停的条⽬
:selected
选中某个被选中的条⽬
background
设置背景颜⾊
border
设置边框
qlineargradient
设置渐变⾊

渐变色

qlineargradient 设置渐变色(线性渐变)

此处要填写六个参数:

  • x1:起点的横坐标
  • y1:起点的纵坐标
  • x2:终点的横坐标
  • y2:终点的纵坐标

这里的取值非常有限,要么是0,要么是1

  • 起点为(0,0)终点是(1,0)就是横向的渐变、
  • 起点为(0,0)终点是(0,1)就是竖向的渐变、
  • 起点为(0,0)终点是(1,1)就是对角线的渐变

如下图所示:

另外两个参数就是

  • stop:0 起始颜色
  • stop:1 结束颜色 
示例:
QListWidget::item:hover{
	background:qlineargradient(x1:0,y1:0,x2:0,y2:1,
	stop:0 #FAFBFE,stop:1 #DCDEF1);
}
QListWidget::item:selected{
	boder:1px solid #6a6ea9;
	background:qlineargradient(x1:0,y1:0,x2:0,y2:1);
}

效果如下:

菜单栏

设置菜单栏的背景色和各个菜单之间的间距

QMenuBar{
	background-color:qlineargradient(x1:0,y1:0,x2:0,y2:1,
	stop:0 lightgray,stop:1 darkgray );
	spacing:3px;
}

设置菜单的背景颜色和内边距

QMenuBar::item{
	padding:1px 4px;
	background:transparent;
	border-radius:4px;
}

 设置选中菜单/点击菜单时背景颜色修改

QMenuBar::item:selected{
	background:#a8a8a8;
}
QMenuBar::item:pressed{
	background:#888888;
}

设置菜单项之间的分割线样式

QMenu::separator{
	height:2px;
	background:lightblue;
	margin-left:10px;
	margin-right:5px;
}

完整代码:

QMenuBar{
	background-color:qlineargradient(x1:0,y1:0,x2:0,y2:1,
	stop:0 lightgray,stop:1 darkgray );
	spacing:3px;
}
QMenuBar::item{
	padding:1px 4px;
	background:transparent;
	border-radius:4px;
}
QMenuBar::item:selected{
	background:#a8a8a8;
}
QMenuBar::item:pressed{
	background:#888888;
}

QMenu{
	background-color:white;	
	margin:0 2px
}
QMenu::item{
	padding:2px 25px 2px 20px;
	border:3px solid transparent;
}
QMenu::item:selected{
	border-color:darkblue;
	background:rgba(100, 100, 100, 150)
}

QMenu::separator{
	height:2px;
	background:lightblue;
	margin-left:10px;
	margin-right:5px;
}

效果如下

属性小结 

属性说明
QMenuBar::item
选中菜单栏中的元素.
QMenuBar::item:selected
选中菜单来中的被选中的元素.
QMenuBar::item:pressed
选中菜单栏中的⿏标点击的元素
QMenu::item
选中菜单中的元素
QMenu::item:selected
选中菜单中的被选中的元素
QMenu::separator
选中菜单中的分割线.

登录界面设计

最终效果

设置背景

在qt中直接给QWidget顶层窗口设置背景图会失效,因此我们可以给上述控件外头套上一个和窗口一样大小的QFrame控件,用来设置背景图。

qt中设置背景图除了background-image之外,还有border-image属性,两者的区别:

  • background-image:设计的背景图片固定大小
  • border-image:设置的背景图片跟随控件的大小变化
QFrame{
	border-image:url(:/background.jpg)
}

使用QVBoxLayout来管理两个输入框和勾选框、按钮;再将这个QVBoxLayout放到一个QFrame中

设置输入框样式 

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

设置按钮样式

QPushButton{
	font-size:20px;
	color:white;
	background-color:#555;
	border-style:outset;
	border-radius:10px;
}
QPushButton:pressed{
	color:black;
	background-color:#ce1db;
	border-style:inset;
}

完整代码

QFrame{
	border-image:url(:/background.jpg)
}

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

QCheckBox{
	color:white;
	background-color:transparent;
}
QPushButton{
	font-size:20px;
	color:white;
	background-color:#555;
	border-style:outset;
	border-radius:10px;
}
QPushButton:pressed{
	color:black;
	background-color:#ce1db;
	border-style:inset;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

clang 编译cuda原理

背景 最近在看一门julia的语言&#xff0c;里面是原生支持cuda的&#xff0c;不过在国产卡上却无法适配&#xff0c;为了开展工作有必要了解非常清楚整个编译的机制。此外在研究过程中发现openai 的triton&#xff0c;以及tvm等一些ai框架对nvidia的支持原理都及其类似&#x…

LinkedList接口源码解读

LinkedList 接口源码解读&#xff08;一&#xff09; 前言 因为追求质量&#xff0c;所以写的较慢。大概在接下来的三天内会把LinkedList源码解析出完。大概还有两篇文章。废话不多说&#xff0c;正片开始&#xff01; 大家都知道&#xff0c;LinkedList是在Java底层中是由 …

【C++标准模版库】模拟实现vector+迭代器失效问题

模拟实现vector 一.vector成员变量二.构造函数1.无参&#xff08;默认&#xff09;构造2.有参构造3.拷贝构造1.传统写法2.现代写法 三.vector对象的容量操作1.size2.capacity3.clear4.empty5.reserve6.resize 四.vector对象的访问及遍历操作1.operator[]2.实现迭代器&#xff1…

一次Linux端口冲突问题排查记录

更多技术博客&#xff0c;请关注微信公众号&#xff1a;运维之美 一、问题现象 实施同学反馈说我们的服务部署到客户环境后&#xff0c;运行正常&#xff0c;但是后台页面就是无法打开&#xff0c;出现访问白屏问题 从console报错看是其中一个接口响应存在问题&#xff0c;…

老兵永远跟党走,团结奋进新征程-百余老兵庆八一暨《永远闪光的军徽》新书发布座谈会在昆举行

7月30日上午,由中国红色文化研究会老山精神专业委员会主办,昆明乡羊香园承办的百余老兵庆祝“八一”建军节暨《永远闪光的军徽》新书发布座谈会在昆明滇池湖畔乡羊香园举行。 上午10时左右,老战士、曾担任云南省军区领导的黄光汉、陶昌廉、和志光、李继才、雷玉德、王永银老将军…

海思Hi35XX系列(一)环境搭建与挂载

小白一个&#xff0c;新的开发板刚到手有点懵&#xff0c;之前没弄过没有经验&#xff0c;简单记录一下吧 一般买开发板都会给带一个已经配置好的虚拟机文件&#xff0c;直接使用就可以 一、下载安装虚拟机与镜像文件 VMware-workstation16.1.0 我的镜像文件是官方文档资料…

亨廷顿小勇士必看!你的维生素补给站来啦~

Hey小伙伴们~&#x1f44b; 今天咱们来聊聊一个超勇敢的话题——亨廷顿舞蹈症宝贝们的健康小秘密&#xff01;&#x1f389; 虽然路途偶尔有点小颠簸&#xff0c;但记得哦&#xff0c;你们是最闪耀的星星✨&#xff01;让我们一起加油&#xff0c;用对维生素&#xff0c;守护这…

C#知识|文件与目录操作:对象的创建、保存、读取

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 面向对象编程的特点就是一切皆对象&#xff0c;操作的也是对象&#xff0c;本节学习文件与目录操作中&#xff0c;对象的保存&#xff1b; 以下为学习笔记。 01 对象的特点 ①&#xff1a;对象运行在内存中&#xff…

4.5K Stars!为 RAG 而生的数据工程神器

—1 大模型 RAG 的难题是什么&#xff1f; RAG 或者 Fine-tuning 微调作为大模型的增强技术&#xff0c;最核心的技术在于如何把企业的私有数据清洗转换成知识&#xff0c;企业中能够第一时间拿到的私有数据&#xff0c;往往是异构的、数据质量参差不齐&#xff0c;通过数据…

ICM-20948芯片详解(3)

接前一篇文章&#xff1a;ICM-20948芯片详解&#xff08;2&#xff09; 三、引脚图、信号描述及内部框图 1. 引脚图 ICM-20948的引脚图如下图所示&#xff1a; 2. 引脚详细描述 ICM-20948的引脚详细描述如下表所示&#xff1a; 注意&#xff1a;不支持在SCL/SCLK和nCS引脚保…

Linux系统窗口水印难点分析

给应用程序加水印是保护数据的一种方式&#xff0c;window上可以通过给进程通过注入的方法给进程的窗口创建一个同大小的副窗口&#xff0c;在副窗口上绘制水印内容&#xff0c;同时设置副窗口透明同时透传事件&#xff0c;这样就可以达到在源窗口上显示水印的效果且不影响程序…

易媒助手:神似融媒宝的自媒体运营工具,新人送7天中级VIP

自媒体运营工具中还有一个易媒助手&#xff0c;功能与融媒宝、蚁小二类似&#xff0c;免费用户可发5个账号&#xff0c;三者同时用就可发15个账号了&#xff0c;所以今天也给大家介绍下&#xff1a; 易媒助手简介 易媒助手于2017年开发&#xff0c;致力于成为中国更优秀的新媒…

springboot集成海康SDK,设备抓图,热成像仪设置多个点代码获取,以及针对红外图点击某一点获取该点温度的需求

本文会介绍java对海康sdk的三个功能&#xff1a; 1、用代码实时抓图 2、用代码获取热成像仪21个点的坐标及其实时温度 3、针对海康热成像仪抓取的热图能够随便点击任意一个点就能获取其温度的功能。 第一个功能&#xff0c;抓图 抓图 在海康提供的sdk中取流后抓图调用的是 …

ollama运行阿里云通义千问72B大模型

准备 安装ollama https://github.com/ollama/ollama 模型 合并gguf copy /B qwen2-72b-instruct-q5_k_m-00001-of-00002.gguf qwen2-72b-instruct-q5_k_m-00002-of-00002.gguf qwen2-72b-instruct-q5_k_m.gguf设置并启动 新建Modelfile FROM ./qwen2-72b-instruct-q5_k…

【课程总结】Day18:Seq2Seq的深入了解

前言 在上一章【课程总结】Day17&#xff08;下&#xff09;&#xff1a;初始Seq2Seq模型中&#xff0c;我们初步了解了Seq2Seq模型的基本情况及代码运行效果&#xff0c;本章内容将深入了解Seq2Seq模型的代码&#xff0c;梳理代码的框架图、各部分组成部分以及运行流程。 框…

想做linux内核开发,该怎么开始(上)

作为一名应届生在选择从事 Linux 内核开发这一职业领域时&#xff0c;需要系统地规划自己的职业道路&#xff0c;这将有助于你更准确地了解未来的发展方向并制定相应的学习和职业发展计划。在这篇文章中&#xff0c;我将向你介绍应届生在 Linux 内核开发领域的职业道路规划&…

O’Reilly

--江上往来人&#xff0c;但爱鲈鱼美。 --君看一叶舟&#xff0c;出没风波里。 OReilly OReilly出版社出版的技术类图书 俗称动物系列 应该是每个技术人员的必备手册。 OReilly动物系列&#xff08;中译本&#xff09; 简介" 动物系列作为 OReilly 书籍的典型代表被普遍…

【Apache Doris】周FAQ集锦:第 18 期

【Apache Doris】周FAQ集锦&#xff1a;第 18 期 SQL问题数据操作问题运维常见问题其它问题关于社区 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目&#xff01; 在这个栏目中&#xff0c;每周将筛选社区反馈的热门问题和话题&#xff0c;重点回答并进行深入探讨。旨在为广大用户…

基于级联深度学习算法在双参数MRI中检测前列腺病变的评估| 文献速递-AI辅助的放射影像疾病诊断

Title 题目 Evaluation of a Cascaded Deep Learning–based Algorithm for Prostate Lesion Detection at Biparametric MRI 基于级联深度学习算法在双参数MRI中检测前列腺病变的评估 Background 背景 Multiparametric MRI (mpMRI) improves prostate cancer (PCa) dete…

如何对我们要多次使用的页面进行一个抽取

有的时候,一个页面我们要多次使用,该怎么抽取呢? 创建一个文件夹,用于存放多次使用的页面 将要多次使用的组件(<template>)和风格(<style>)剪切出来,放入新建的页面 直接进行引用 导入 然后就可以使用