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

QT样式表详解

本文详细介绍qt的样式表,包含样式表如何使用,常见语句和选择器。

背景说明

样式表用于设置外观,他是设置控件外观的方式之一。其他方式如下:

  1. 控件的成员函数,如QWidget::setBackground
  2. 样式表
  3. 调色板

优先级依次提高。调色板有最高优先级。

样式表

qt控件通过setsytlesheet(“样式表代码”)来使用样式表代码。QWidget::setstylesheet设置的qss代码作用域是设置它的控件以及其子控件。

下面是qss代码的一个举例

QPushButton {background-color: red;
}

这个代码的意思是把作用域的QPushButton控件的背景颜色设置为红色。

到底是哪个QPushButton的背景变成红色取决于谁调用了setstylesheet来应用这个样式表。如果是某个Qframe调用,则容器内所有的按钮背景都是红色,但其他Qframe中的按钮不受影响,因为setstylesheet的作用域只有调用它的QFrame以及QFrame中的子控件。如果是某个QPushButton调用,则只有这个QPushButton背景会变成红色,。

setsytlesheet函数使用示例

下面通过简单的例子来示意setstylesheet函数怎么用。

#include <QApplication>
#include <QPushButton>int main(int argc, char *argv[])
{QApplication a(argc, argv);QPushButton button("Click me!");button.setGeometry(100, 100, 200, 50);button.setStyleSheet("QPushButton {""    background-color: red;""}");button.show();return a.exec();
}

像这样,界面上那个调用了setStyleSheet的按钮背景颜色就变成红色了。

加载全局qss样式

我们可以在一个文件中描述所有界面上所有控件的样式。然后使用QApplication::setStyleSheet来应用全局样式。这样做的好处是分离功能和外观布局。外观布局用qss写,如果外观只是变个颜色,添加一个新的qss文件就行了,其他代码甚至都不用重新编译。下面就是加载全局样式的示例

#include <QApplication>
#include <QFile>int main(int argc, char *argv[])
{QApplication a(argc, argv);QFile file(":/style.qss");  // 加载 qss 文件if (file.open(QFile::ReadOnly | QFile::Text)){QString styleSheet = QString::fromUtf8(file.readAll());a.setStyleSheet(styleSheet);  // 应用样式表file.close();}// 创建窗口和控件等代码// ...return a.exec();
}

这样写的qss代码,作用域是整个 应用程序。其中代码写在了style.qss文件中。

样式表的作用域、选择器、语句概念

  • 作用域是指qss语句可能对哪些区域的控件进行设置,它取决于setStyleSheet在哪里被调用。
  • 作用域是明确的,一旦调用了setStyleSheet,作用域就确定了。
  • 作用域不体现在qss代码中。而体现在setStyleSheet的位置。
  • 选择器是指对作用域内的哪些控件进行设置。
  • 选择器是可选的,可以不存在选择器。

qss代码由选择器和语句构成,其中选择器不一定有,qss代码语法如下

选择器{语句1;语句2;
}

下面将介绍分别介绍语句和选择器

语句

语句用来描述控件的外观,需要记忆。
设置控件背景颜色:background-color: <颜色值>;
设置控件前景颜色:color: <颜色值>;
设置控件背景图片:background-image: url(<图片路径>);
设置背景图片平铺至整个控件区域,当控件大小发生变化时,背景图片也会跟着变化:background-image: url(<图片路径>);
设置背景图片居中显示,当控件大小发生变化时,背景图片不会跟着变化:background-image: url(<图片路径>) 0 0 no-repeat;
将背景图片平铺至整个控件区域,当控件大小发生变化时,背景图片会等比例拉伸:background-image: url(<图片路径>) 0 0 stretch;
设置控件背景重复方式:background-repeat: <repeat|repeat-x|repeat-y|no-repeat>;
设置控件背景位置:background-position: <水平位置> <垂直位置>;
设置控件大小:width: <宽度>; height: <高度>;
设置控件最小大小:min-width: <宽度>; min-height: <高度>;
设置控件最大大小:max-width: <宽度>; max-height: <高度>;
设置控件透明度:opacity: <透明度>;
设置控件的对齐方式:alignment: <左|右|中>;
设置控件的间距:spacing: <距离>;
设置控件的填充:margin: <上> <右> <下> <左>;
设置控件的边框:border: <宽度> <样式> <颜色>;
设置控件的边框颜色:border-color: <颜色>;
设置控件的边框样式:border-style: <none|solid|dashed|dotted>;
设置控件的边框宽度:border-width: <宽度>;
设置控件的圆角半径:border-radius: <大小>;
设置控件的阴影:box-shadow: <位置> <大小> <颜色>;
设置控件的内边距:padding: <上> <右> <下> <左>;
设置控件的文本对齐方式:text-align: <left|right|center|justify>;
设置控件的文本装饰:text-decoration: <none|underline|overline|line-through>;
设置控件的文本字间距:letter-spacing: <距离>;
设置控件的文本行间距:line-height: <大小>;
设置控件的字体:font: <字体>;
设置控件的字体大小:font-size: <大小>;
设置控件的字体颜色:color: <颜色>;
设置控件的字体加粗:font-weight: <normal|bold>;
设置控件的字体斜体:font-style: <normal|italic>;
设置控件的字体下划线:text-decoration: <none|underline>;
设置控件的图标大小:icon-size: <宽度> <高度>;

选择器

选择器可以让我们定位到作用域里的某个或者某组控件,只设置这一个或者这一组控件的外观。比如作用域内上有好多按钮,我希望写一个qss,让一部分按钮的背景颜色是红色,另一部分是绿色。就需要用到选择器定位到那些有特殊要求的控件。

通用选择器

*{background-color: red;
}

* 就是通用选择器,它使得background-color: red作用于作用域内的所有控件。

类型选择器

选择指定的类及其子类

类名{语句;
}

QFrame{background-color: red;
}

选择的是作用域内的QFrame以及其子类如QLabel等。QPushButton不是QFrame的子类,所有不会被选择。

类选择器

区别于类型选择器,它只选择指定的类,而不选择其子类

.类名{语句;
}

.QFrame{background-color: red;
}

选择作用域内的QFrame,而其他类不受影响。

id选择器

----------------背景介绍-----------------------
控件可以通过setObjectName设置它的id。

QPushButton* bt1=new QPushButton();
bt1.setObjectName("button1");

----------------------------------------------------
选择指定id的控件。

#id{语句
}

#button1{background-color: red;
}

这样会把作用域内objectName为button1的所有控件背景颜色都设置成红色。

属性选择器

----------------背景介绍-----------------------
控件可以通过setProperty设置它的属性。

QPushButton* bt1=new QPushButton();
bt1.setProperty("level", "dangerous");

这样设置了bt1的level属性为dangerous
----------------------------------------------------
选择指定属性为指定值的控件

[属性名=属性值]{语句;
}

[level=dangerous]{background-color: red;
}

这样把作用域内所有level属性为dangerous的控件的背景颜色设置为了红色。

包含选择器

比较难描述定义,直接看示例吧

QFrame QPushButton {background: white;
}

这里使得QFrame下的QPushButton的背景颜色为白色。如果一个QPushButton不在某个QFrame中,是不会被选择的。
包含选择器可以不止两层,可以更多,比如QFrame下的QFrame下的QPushButton。

子元素选择器

选择一个控件的直接子控件。

父控件 > 子控件 {语句;
}

QFrame > QGroupBox {background: white;
}

选择QFrame下的QGroupBox,背景为白色,但不会影响QGroupBox的子控件。

伪类选择器

当控件处于某种状态时,选择它

控件名:[可选的“!”,!表示取反]状态{语句;
}

QCheckBox:!checked { 
color: red 
}

当QChectBox没有被选中时,它的颜色为红色。
常用状态

状态说明
:disabledWidget 被禁用时
:enabledWidget 可使用时
:focusWidget 得到输入焦点
:hover鼠标放到 Widget 上
:pressed鼠标按下时
:checked被选中时
:unchecked未选中时
:has-childrenItem 有子 item,例如 QTreeView 的 item 有子 item 时
:has-siblingsItem 有 兄弟,例如 QTreeView 的 item 有兄弟 item 时
:open打开或展开状态,例如 QTreeView 的 item 展开,QPushButton 的菜单弹出时
:closed关闭或者非展开状态
:onWidget 状态是可切换的(toggle), 在 on 状态
:offWidget 状态是可切换的(toggle), 在 off 状态

subcontrol选择器

选择控件的一部分。有些控件是由多个部分组成的,例如 QCheckBox 由 icon(indicator) 和 text 组成。

类名::部分{语句;
}

QCheckBox::indicator {width: 20px;height: 20px;
}
QCheckBox {spacing: 8px;
}

常用的控件部分

Subcontrol说明
::indicatorA QCheckBox, QRadioButton, checkable QMenu item, or a checkable QGroupBox’s indicator
::menu-indicatorA QPushButton’s menu indicator
::itemA QMenu, QMenuBar, or QStatusBar’s item
::up-buttonA QSpinBox or QScrollBar’s up button
::down-buttonA QSpinBox or QScrollBar’s down button
::up-arrowA QSpinBox, QScrollBar, or QHeaderView’s up arrow
::down-arrowA QSpinBox, QScrollBar, or QHeaderView’s down arrow
::drop-downA QComboBox’s drop-down arrow
::titleA QGroupBox or QDockWidget’s title
::grooveA QSlider’s groove
::chunkA QProgressBar’s progress chunk
::branchA QTreeView’s branch indicator

相关文章:

QT样式表详解

本文详细介绍qt的样式表&#xff0c;包含样式表如何使用&#xff0c;常见语句和选择器。 背景说明 样式表用于设置外观&#xff0c;他是设置控件外观的方式之一。其他方式如下&#xff1a; 控件的成员函数&#xff0c;如QWidget::setBackground样式表调色板 优先级依次提高…...

最值得入手的好物有哪些,推荐几款实用的数码好物

随着科技的进步&#xff0c;越来越多的数码产品不断的出现在我们的生活中&#xff0c;这其中也不乏一些实用的数码产品&#xff0c;让我们可以享受更舒适的生活&#xff0c;提高我们的工作效率。下面就给大家分享几款我最近使用过的一些数码产品&#xff0c;它们不仅功能强大而…...

【20230407】NVIDIA显卡算力、Jetson比较

1 基本概念 1.1 算力单位 TOPS&#xff1a;指的是每秒钟可以执行的整数运算次数&#xff0c;它代表着计算机在处理图像、音频等任务时的处理能力。TOPS的单位是万亿次每秒&#xff08;trillion operations per second&#xff09;。一般是指整数运算能力INT8。 TFLOPS&#…...

dsl语法

查询 1.查询所有&#xff08;默认有分页查询&#xff09; #查询所有 GET /hotel/_search {"query": {"match_all": {}} } 2.match查询&#xff08;条件查询&#xff09;-----包含四川和外滩的信息&#xff0c;信息匹配度越高越靠前&#xff0c;两者存在一…...

不让CPU偷懒

文章资料摘自——《程序员的自我修养》 为了防止cpu执行完该程序后需要等待程序员手动加入下一个程序&#xff0c;才可以继续运行&#xff0c;这里大大浪费了cpu的效率&#xff0c;要知道cpu是十分昂贵的。 多道程序 在计算机发展的早期&#xff0c;CPU使用十分不方便&#x…...

动力节点王鹤SpringBoot3笔记——第七章 视图技术Thymeleaf

目录 第七章 视图技术Thymeleaf 前言 7.1 表达式 7.2 if-for 第七章 视图技术Thymeleaf 前言 Thymeleaf 是一个表现层的模板引擎&#xff0c; 一般被使用在 Web 环境中&#xff0c;它可以处理 HTML, XML、 JS 等文档&#xff0c;简单来说&#xff0c;它可以将 JSP 作…...

从比特保存和信息保存看数字资源长期保存

引用IBM以色列海法实验室的观点&#xff0c;数字资源长期保存包含两个层面含义&#xff0c;即比特保存与信息保存。也就是说&#xff0c;要实现数字资源的长期保存&#xff0c;必须同时做到比特保存和信息保存。 一 ​概念 01 比特保存&#xff0c;也叫物理保存&#xff0c;主…...

兰伯特光照模型(Lambert Lighting)和半兰伯特光照模型(Half-Lanbert)

关于漫反射 光打到凹凸不平的平面上&#xff0c;光线会被反射到四面八方&#xff0c;被称为漫反射 关于这种模型&#xff0c;由于光线由于分散&#xff0c;所以进入人眼的光线强度和观察角度没有区别 在A点和B点接收到的光线强度是一样的 在漫反射下&#xff0c;光线强度只和光…...

Python 进阶指南(编程轻松进阶):二、环境配置和命令行

原文&#xff1a;http://inventwithpython.com/beyond/chapter2.html 环境配置是配置你的计算机环境&#xff0c;以便你写代码的过程。这包括安装任何必要的工具&#xff0c;配置它们&#xff0c;以及处理安装过程中的任何问题。没有一键配置这种傻瓜式操作过程&#xff0c;因为…...

求职半年,三月成功拿到阿里offer,分享一波面经...

前言 不论是校招还是社招都避免不了各种⾯试、笔试&#xff0c;如何去准备这些东⻄就显得格外重要。不论是笔试还是⾯试都是有章可循的&#xff0c;我这个“有章可循”说的意思只是说应对技术⾯试是可以提前准备&#xff0c;所谓不打无准备的仗就是这个道理。 以下为大家&…...

餐饮店的运营需要考虑哪些方面

餐饮店的运营需要多方面的考虑和规划&#xff0c;以下是传递宝APP上一些常用的餐饮店运营方法&#xff1a; 1.定位&#xff1a;明确餐饮店的定位和目标客户群体&#xff0c;针对不同的客户需求&#xff0c;提供个性化的服务和产品&#xff0c;比如是附近的上班族&#xff0c;还…...

Multi-modal Alignment using Representation Codebook

Multi-modal Alignment using Representation Codebook 题目Multi-modal Alignment using Representation Codebook译题使用表示代码集的多模态对齐期刊/会议CVPR 摘要&#xff1a;对齐来自不同模态的信号是视觉语言表征学习&#xff08;representation learning&#xff09;的…...

关于vector的emplace_back和push_back的区别

实验代码&#xff1a; class A { public:A(int x) {x x;cout << "construct A" << endl;}A(const A& a) {x a.x;cout << "copy construct A" << endl;}A(const A&& a) {cout << "Move construct A"…...

Vue——表单输入绑定

目录 基本用法​ 文本 多行文本 复选框​ 选择器​ 值绑定​ 复选框 单选按钮 选择器选项 修饰符​ .lazy​ .number​ .trim​ 组件上的 v-model​ 在前端处理表单时&#xff0c;我们常常需要将表单输入框的内容同步给 JavaScript 中相应的变量。手动连接值绑定…...

MySQL性能优化(二)索引

文章目录优化手段准备案例索引的本质索引的数据结构不同存储引擎中索引的实践MyIsam &#xff08;索引没有主次之分、都存放在MYI文件&#xff09;主键索引其他索引InnoDB&#xff08;数据即索引、索引即数据&#xff09;主键索引——聚集索引聚集索引其他索引没有主键的情况&a…...

< 每日闲谈:你真的了解 “ ChatGPT ” 嘛 ? >

< 每日闲谈&#xff1a;你真的了解 “ ChatGPT ” 嘛 &#xff1f; >&#x1f449; 前言&#x1f449; OpenAI的创立&#x1f449; ChatGPT有何过人之处&#xff1f;> 效果演示&#x1f449; OpenAI看家之作 — GPT自然语言模型> GPT发展史> 里程碑-GPT3> 从…...

改善Instagram客户服务的6个技巧

Instagram仍然是全球前四大社交网络&#xff0c;按用户数量排名。它通过其创新的过滤器、内容创建工具、视频和卷轴选项继续增长并推动流量。这是一个平台&#xff0c;世界顶级名人和有影响力的人可以为全球用户提供有趣和令人印象深刻的内容。 但不仅仅是一个娱乐平台&#xf…...

8年经验之谈:4步解决测试与开发人员有争议的bug问题...

“开发认为不是bug&#xff0c;测试如何处理&#xff1f;”很多面试中&#xff0c;测试工程师都会被问到这个问题&#xff0c;不仅仅是面试&#xff0c;工作中测试人员也会遇到这类问题&#xff0c;甚至可能由于某种原因&#xff0c;无论是开发人员还是开发经理就是不愿修改程序…...

Linux日常小技巧shell脚本

在工作中我们常用shell脚本处理一些问题,这里整理了一些工作中常用的简单shell脚本。 定时备份文件 #!/bin/bash backup_dir="/data1/backup" src_dir="/data1/app" date_time=$(date +%Y%m%d_%H%M%S) tar -czvf ${backup_dir}/${date_time}.tar.gz ${sr…...

技术创业者必读:从验证想法到技术产品商业化的全方位解析

导语 | 技术创业之路往往充满着挑战和不确定性&#xff0c;对于初入创业领域的人来说&#xff0c;如何验证自己的创业想法是否有空间、如何选择靠谱的投资人、如何将技术产品商业化等问题都需要认真思考和解决。在「TVP 技术夜未眠」第六期直播中&#xff0c;正马软件 CTO、腾讯…...

零基础在实践中学习网络安全-皮卡丘靶场(第十四期-XXE模块)

本期内容涉及到很多前面的内容&#xff0c;因此复习后可以更好的了解本期内容 介绍 XXE -"xml external entity injection"即"xml外部实体注入漏洞"。 概括一下就是"攻击者通过向服务器注入指定的xml实体内容,从而让服务器按照指定的配置进行执行,导…...

勒让德多项式

勒让德多项式 (Legendre) 当区间为 [ − 1 , 1 ] [-1,1] [−1,1]&#xff0c;权函数 ρ ( x ) 1 ρ(x)1 ρ(x)1时&#xff0c;由 1 , x , . . . , x n , . . . {1,x,...,x^n,...} 1,x,...,xn,...正交化得到的多项式称为勒让德多项式&#xff0c;并用 P 0 ( x ) , P 1 ( x ) ,…...

前端开发面试题总结-HTML篇

文章目录 HTML面试高频问答一、HTML 的 src 和 href 属性有什么区别?二、什么是 HTML 语义化?三、HTML的 script 标签中 defer 和 async 有什么区别?四、HTML5 相比于 HTML有哪些更新?五、HTML行内元素有哪些? 块级元素有哪些? 空(void)元素有哪些?六、iframe有哪些优点…...

DAY 44 预训练模型

知识点回顾&#xff1a; 预训练的概念常见的分类预训练模型图像预训练模型的发展史预训练的策略预训练代码实战&#xff1a;resnet18 &#xff08;一&#xff09;预训练的概念 我们发现准确率最开始随着epoch的增加而增加。随着循环的更新&#xff0c;参数在不断发生更新。 所以…...

神经网络-Day44

import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pyplot as plt# 设置中文字体支持 plt.rcParams["font.family"] ["SimHei"…...

C++ 信息学奥赛总复习题

第一章 C 基础语法 一、填空题 C 源文件的扩展名通常是______。C 程序的入口函数是______。在 C 中&#xff0c;注释有两种形式&#xff0c;分别是______和______。声明一个整型变量 a 的语句是______。输出语句的关键字是______。 二、判断题 C 区分大小写。&#xff08; …...

Ps:Adobe PDF 预设

Ps菜单&#xff1a;编辑/Adobe PDF 预设 Edit/Adobe PDF Presets 通过“Adobe PDF 预设” Adobe PDF Presets对话框&#xff0c;可以查看 Adobe PDF 预设&#xff0c;了解复杂的 PDF 设置。还可以编辑、新建、删除、载入预设&#xff0c;根据最终用途&#xff08;如高质量打印、…...

xcode 各版本真机调试包下载

下载地址 https://github.com/filsv/iOSDeviceSupport 使用方法&#xff1a; 添加到下面路径中&#xff0c;然后退出重启xcode /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport...

算法-多条件排序

1、数对排序的使用 pair<ll,ll> a[31];//cmp为比较规则 ll cmp(pair<ll,ll>a,pair<ll,ll>b){if(a.first!b.first)return a.first>b.first;else return a.second<b.second; }//按照比较规则进行排序 sort(a1,a31,cmp); 2、具体例题 输入样例&#xff1…...

3. 简述node.js特性与底层原理

&#x1f63a;&#x1f63a;&#x1f63a; 一、Node.js 底层原理&#xff08;简化版&#xff09; Node.js 是一个 基于 Chrome V8 引擎构建的 JavaScript 运行时&#xff0c;底层核心由几部分组成&#xff1a; 组成部分简要说明 1.V8 引擎 将 JS 编译成机器码执行&#xff0…...