Qt界面优化——QSS

news2024/11/19 17:37:05

文章目录

    • QSS基本语法
    • 使用示例
    • 样式和代码分离
    • 选择器用法
    • 子控件选择器
    • 伪类选择器
    • 盒子模型
    • 控件样式示例
      • 按钮
      • 复选框
      • 输入框
      • 列表框
      • 菜单
    • 登录界面

QSS基本语法

Qt对界面进行优化,主要采用的是QSS。

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

选择器:先选择某个/类控件,然后对其属性进行设置

键值对:针对某些样式的具体设置

例如:

QPushButton
{
    color: red;
}

使用示例

默认样式:

image-20241001123200098

设置字体颜色:

ui->pushButton->setStyleSheet("QPushButton { color:red; }");

这种是针对当前控件及它的子控件生效

image-20241001123705340

设置全局样式:

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

全局样式的设置,需要在main.cpp文件当中编写

#include "widget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    a.setStyleSheet("QPushButton { color: green; }");
    Widget w;
    w.show();
    return a.exec();
}

image-20241001124038800

如果设置了全局样式,然后在某个控件里面又设置了其他的样式,两者会叠加起来:

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    ui->pushButton->setStyleSheet("QPushButton { font-size: 10px; }");
}

Widget::~Widget()
{
    delete ui;
}

image-20241001124356682

如果设置了全局样式,在某个控件里设置的样式和全局样式冲突了,局部优先级更高:

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    ui->pushButton_2->setStyleSheet("QPushButton { color: yellow; }");
}

Widget::~Widget()
{
    delete ui;
}

image-20241001124600913

样式和代码分离

上述代码都是样式代码和C++代码混合在一起的。如果QSS代码比较复杂,代码维护成本就较高了。

我们可以将样式代码分离出来,放在单独的文件当中。后续让C++代码来读取。

  1. 创建qrc文件,通过qrc管理文件
  2. 创建单独QSS文件,将文件放入qrc当中
  3. 让C++代码读取qrc文件

image-20241001162140782

Qt Creator当中并没有提供直接创建qss的选项,这里我们是直接右键文本文档,然后更改名字和后缀

image-20241001162352703

让代码加载文件内容,在main.cpp当中:

#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();
}

上述方法仅供参考,还有更加简便的方法

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

image-20241001163112980

这里的修改都会记录到ui文件当中,并在程序运行时自动生效,而且还能进行预览。

此时ui文件里面就多了一段这样的代码:

image-20241001163143367

也可以单独给控件进行设置。

但由于设置样式太灵活了,当某个控件样式不符合预期的时候,排查就比较麻烦:

  1. 全局样式
  2. 指定控件样式
  3. 指定控件的父控件样式
  4. qss文件样式
  5. 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选择器:

#include "widget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    
    QString style = "QPushButton { color: red; }";
    style += "#pushButton_2 {color: yellow; }";
    style += "#pushButton_3 {color: green; }";
    
    Widget w;
    w.show();
    return a.exec();
}

image-20241001164802979

如果ID选择器和类型选择器冲突,ID优先级较高,如果不冲突,则堆叠显示

并集选择器:

#include "widget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

//    QString style = "QPushButton { color: red; }";
//    style += "#pushButton_2 {color: yellow; }";
//    style += "#pushButton_3 {color: green; }";
    QString style = "QPushButton, QLineEdit, QLabel { color: green; }";
    a.setStyleSheet(style);
    Widget w;
    w.show();
    return a.exec();
}

image-20241001165041275

子控件选择器

这些就是Qt当中的子控件

image-20241001165617423

QComboBox下拉框子控件样式:

image-20241001165851325

qrc导入图标:

image-20241001170005902

#include "widget.h"

#include <QApplication>

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

image-20241001170218654

伪类选择器

上面的选择器,选中的都是“控件”。而伪类选择器选中的是控件的“状态”。

伪类选择器说明
:hover鼠标放到控件上
:pressed鼠标左键按下时
:focus获取输入焦点时
:enabled元素处于可以状态时
:checked被勾选时
:read-only元素为只读状态时

image-20241001183132916

#include "widget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QString style = "QPushButton { color: red; }";
    style += "QPushButton:hover { color: green; }";
    style += "QPushButton:pressed { color: blue; }";
    a.setStyleSheet(style);
    Widget w;
    w.show();
    return a.exec();
}

GIF 2024-10-1 18-35-08

也可以通过事件的方式进行实现

void mousePressEvent(QMouseEvent* e);
void mouseReleaseEvent(QMouseEvent* e);
void enterEvent(QEvent* e);
void leaveEvent(QEvent* e);

盒子模型

QSS中的样式很多,使用的时候,及时查阅即可。

Qt中的每一个widget都是矩形

image-20241001184405606

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

**复合属性:**由多个属性构成。

例如margin可以拆分为4个属性:

  1. margin-left
  2. margin-right
  3. margin-top
  4. margin-bottom
margin: 10px;	//四个方向都是10px的外边距
margin: 10px 20px;	//上下10px, 左右20px
margin: 10px 20px 30px 40px;	//上右下左(顺时针)

image-20241001185356322

#include "widget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //边框5像素	绿色虚线
    //内边距50像素
    QString style = "QLabel { border: 5px dashed green; padding-left: 50px; }";
    a.setStyleSheet(style);
    Widget w;
    w.show();
    return a.exec();
}

image-20241001185857986

外边距:

#include "widget.h"
#include "ui_widget.h"
#include<QPushButton>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    QPushButton* button = new QPushButton(this);
    button->setGeometry(0, 0, 100, 100);    //指定具体位置
    button->setText("按钮");
    button->setStyleSheet("QPushButton { border: 5px solid green; margin: 20px;}"); //指定边框和外边距

}

Widget::~Widget()
{
    delete ui;
}

image-20241001190321680

此时看着像小了一圈,但实际上矩形的尺寸和位置都是没变的。

控件样式示例

按钮

  • font-size设置字体大小
  • border-radius设置圆角矩形
  • background-color设置背景色
  • color设置文章颜色

image-20241001191244563

GIF 2024-10-1 19-12-23

复选框

要点说明
::indicator子控件选择器.
选中 checkbox 中的对钩部分
::hover伪类选择器
选中鼠标移动上去的状态
::pressed伪类选择器
选中鼠标按下的状态
::checked伪类选择器
选中 checkbox 被选中的状态
::unchecked伪类选择器
选中 checkbox 未被选中的状态
width设置子控件宽度
对于普通控件无效 (普通控件使用 geometry 方式设定尺寸)
height设置子控件高度
对于普通控件无效 (普通控件使用 geometry 方式设定尺寸).
image设置子控件的图片
像 QSpinBox, QComboBox 等可以使用这个属性来设置子控件的图片

更改样式表:

QCheckBox {
	font-size: 20px;
}

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

QCheckBox::indicator::unchecked {
	image: url(:/checkbox-unchecked.png);
}

QCheckBox::indicator::unchecked::hover {
	image: url(:/checkbox--unchecked_hover.png);
}

QCheckBox::indicator::unchecked::pressed {
	image: url(:/checkbox-unchecked_pressed.png);
}

QCheckBox::indicator::checked {
	image: url(:/checkbox-checked.png);
}

QCheckBox::indicator::checked::hover {
	image: url(:/checkbox-checked_hover.png);
}

QCheckBox::indicator::checked::pressed {
	image: url(:/checkbox-checked_pressed.png);
}

GIF 2024-10-1 19-44-36

输入框

更改样式表:

QLineEdit {
	border-width: 2px;
	border-color: rgb(170, 170, 255);
	border-style: solid;
	border-radius: 20px;
	padding-left: 10px;
	color: rgb(170, 85, 127);
	font-size: 24px;
	background-color: rgb(220, 220, 220);
	selection-color: rgb(0, 180, 0);
	selection-background-color: rgb(180, 0, 0);
}

GIF 2024-10-1 19-58-58

属性说明
border-width设置边框宽度
border-radius设置边框圆角
border-color设置边框颜色
border-style设置边框风格
padding设置内边距
color设置文章颜色
background设置背景颜色
selection-background-color设置选中文字的背景颜色
selection-color设置选中文字的文本颜色

列表框

qlineargradient设置渐变色,此处填写6个参数:

  • x1:起点横坐标

    y1:起点纵坐标(非零即一)

  • x2:终点横坐标
    y2:终点纵坐标

  • 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 {
	background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #6a6ea9, stop: 1 #888dd9);
}

GIF 2024-10-1 20-14-36

菜单

QMenuBar {
	background-color:rgb(255, 230, 255)
}

QMenuBar::item {
	border-radius: 10px;
	padding: 3px 10px;
	background-color: rgb(255, 255, 219);
}

QMenuBar::item::selected {
	background-color: rgb(170, 85, 0);
}

QMenu::item {
	border: 2px solid transparent;
	padding: 2px 10px;
}

QMenu::item::selected {
	border: 2px solid blue;
}

QMenu::separator {
	height: 2px;
	background-color: green;
	margin 0 2px;	
}

GIF 2024-10-1 20-54-56

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

登录界面

image-20241001210442128

Qt存在限制,给顶层窗口设置背景图会失效

通过给当前控件外层再套一层和窗口一样大小的QFrame控件,然后讲这些控件放入QFrame当中。

image-20241001210701538

Qt中设置背景图,除了background-image,还有border-image

Qt官方推荐border-image,因为这个会跟随控件大小自动变化

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

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

QCheckBox {
	color: rgb(255, 184, 85);
	font-size: 18px;
}

QPushButton {
	font-size: 20px;
}

GIF 2024-10-1 21-21-46

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

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

相关文章

【JVM】双亲委派机制打破双亲委派机制

双亲委派机制 类加载器的双亲委派机制 由于Java虚拟机中有多个类加载器&#xff0c;双亲委派机制的核心是解决一个类到底由谁加载的问题。 双亲委派的作用&#xff1a; 保证类加载的安全性&#xff1a;通过双亲委派机制避免恶意代码替换 JDK中的核心类库。避免重复加载&…

算法题总结(五)——普通数组

普通数组 #238、除自身以外数组的乘积 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要…

JDBC相关内容

第1章&#xff1a;JDBC概述 1.1 数据的持久化 持久化(persistence)&#xff1a;把数据保存到可掉电式存储设备中以供之后使用。大多数情况下&#xff0c;特别是企业级应用&#xff0c;数据持久化意味着将内存中的数据保存到硬盘上加以”固化”&#xff0c;而持久化的实现过程大…

进程--消息队列和共享内存

目录 消息队列 创建消息队列 删除消息队列 发送消息和接收 消息队列 消息队列就是一个消息的列表&#xff0c;进程可以在消息队列中添加消息和的读取消息 消息队列具有FIFO的特性&#xff0c;具有无名管道与有名管道各自的优势&#xff0c;可以支持任意两个进程的进程间通讯…

【python实操】python小程序之随机抽签以及for循环计算0-x的和

引言 python小程序之随机抽签以及for循环计算0-x的和 文章目录 引言一、随机抽签1.1 题目1.2 代码1.3 代码解释 二、for循环计算0-x的和2.1 题目2.2 代码2.3 代码解释 三、思考3.1 随机抽签3.2 for循环计算0-x的和 一、随机抽签 1.1 题目 使用input输入五个同学的名字随机抽取…

对于基础汇编的趣味认识

汇编语言 机器指令 机器语言是机器指令的集合 机器指令展开来讲就是一台机器可以正确执行的命令 电子计算机的机器指令是一列二进制数字 &#xff08;计算机将其转变为一列高低电平&#xff0c;使得计算机的电子器件受到驱动&#xff0c;进行运算 寄存器&#xff1a;微处理器…

zabbix7.0创建自定义模板的案例详解(以监控httpd服务为例)

前言 服务端配置 链接: rocky9.2部署zabbix服务端的详细过程 环境 主机ip应用zabbix-server192.168.10.11zabbix本体zabbix-client192.168.10.12zabbix-agent zabbix-server(服务端已配置) 创建模板 模板组直接写一个新的&#xff0c;不用选择 通过名称查找模板&#xf…

动手学深度学习(李沐)PyTorch 第 6 章 卷积神经网络

李宏毅-卷积神经网络CNN 如果使用全连接层&#xff1a;第一层的weight就有3*10^7个 观察 1&#xff1a;检测模式不需要整张图像 很多重要的pattern只要看小范围即可 简化1&#xff1a;感受野 根据观察1 可以做第1个简化&#xff0c;卷积神经网络会设定一个区域&#xff0c…

wenyan:markdown 一键转换文章排版

介绍 今天给大家介绍一个markdown排版成自媒体文章的工具。 markdown 的重要性和便捷性不用再多说&#xff0c;但是从markdown 转换到文章排版&#xff0c;我换了很多个也都很不满意&#xff0c;尤其在不支持markdown的平台&#xff0c;更是一言难尽。 本次介绍的wenyan的核心…

JDBC进阶

目录 JDBC进阶 实体类和ORM 主键回显 批量操作 连接池 介绍 常见的连接池 Druid连接池 Hikari连接池 连接池与软编码 其他配置 Druid配置 Hikari配置 JDBC进阶 实体类和ORM 在使用JDBC操作数据库时会发现数据都是零散的&#xff0c;明明在数据库中是一行完整的数…

【四】Spring Cloud OpenFeign原理分析

Spring Cloud OpenFeign原理分析 概述 Spring Cloud 微服务实践也有挺多年了&#xff0c;一直想着总结一下这系列的知识点&#xff0c;最近终于下定决心来出一个Spring Cloud 系列文章了。本文主要围绕fegin组件来进行讲解&#xff0c;文中将会给出基础使用的示例&#xff0c;还…

0x10 用友 畅捷通T+ RecoverPassword.aspx 管理员密码修改漏洞

参考&#xff1a; 用友 畅捷通T RecoverPassword.aspx 管理员密码修改漏洞 | PeiQi文库 (wgpsec.org) 免责声明 欢迎访问我的博客。以下内容仅供教育和信息用途&#xff1a; 合法性&#xff1a;我不支持或鼓励非法活动。请确保遵守法律法规。信息准确性&#xff1a;尽管我尽…

全站最详细的Python环境配置步骤

1、官网下载IDE JetBrains下载 2、IDE下载、安装步骤 这里展示的是如何在Windows上下载、安装Pycharm工具&#xff0c;Linux的步骤类似。 2.1、选择开发者工具 选择开发者工具 2.2、选择Pycharm 选择Pycharm 2.3、选择下载 选择下载 2.4、选择社区版 一般而言&#xff…

【STM32-HAL库】AHT10温湿度传感器使用(STM32F407ZGT6配置i2c)(附带工程下载连接)

一、温湿度传感器&#xff1a; 温湿度传感器是一种能够检测环境中的温度和湿度&#xff0c;并将其转化为电信号输出的装置。它在智能家居、工业自动化、气象监测、农业等领域有着广泛的应用。 原理&#xff1a; 温湿度传感器通常基于不同的物理原理&#xff0c;以下是一些常见…

补:vs调试技巧!

目录 1>>闲话 2>>bug 3>>debug调式 4>>debug和release 5>>监视和内存观察 6>>总结 1>>闲话 数据结构章节在国庆后再给大家更喔&#xff0c;现在先把c基础打好&#xff0c;所以我又重返回去学习c语言&#xff0c;并且&#xff0…

17 vue3之tsx手写vite tsx插件

我们之前呢是使用Template去写我们模板。现在可以扩展另一种风格TSX风格 vue2 的时候就已经支持jsx写法&#xff0c;只不过不是很友好&#xff0c;随着vue3对typescript的支持度&#xff0c;tsx写法越来越被接受&#xff0c;减少我们学习react的成本 Ant Design组件库就是使用…

利用LLMs自动寻找量化投资策略

利用LLMs自动寻找量化投资策略 J.P.Morgan的python教程 Content 本文提出了一个利用大型语言模型&#xff08;LLMs&#xff09;和多代理架构的新框架&#xff0c;用于量化股票投资和投资组合管理。该框架通过整合LLMs生成多样化的alpha因子&#xff0c;并动态评估市场条件&am…

基于 QAnything 的知识库问答系统:技术解析与应用实践

最近已有不少大厂都在秋招宣讲了&#xff0c;也有一些在 Offer 发放阶段。 节前&#xff0c;我们邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对新手如何入门算法岗、该如何准备面试攻略、面试常考点、大模型技术趋势、算法项目落地经验分享等热门话题进行了…

Mysql 学习——项目实战

MySQL 学习——项目实战 项目出处 博主&#xff1a;Asmywishi Linux-Ubuntu启动Mysql sudo mysqlData preparation Create Database and Table Create database : create database mysql_example1;Start database : use mysql_example1;Create Student table : # 学生表…

vue页面保持在div的底部(适用于聊天界面等需要显示最新信息的场景)

代码示例&#xff1a; <script setup lang"ts"> import {nextTick, onMounted, ref} from vueconst count [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, …