【Qt】Qt界面美化指南:深入理解QSS样式表的应用与实践

文章目录

  • 前言:
  • 1. 背景介绍
  • 2. 基本语法
  • 3. QSS 设置方式
    • 3.1. 设置全局样式
    • 3.2. 从文件加载样式表
    • 3.3. 使用 Qt Designer 编辑样式
  • 总结:

前言:

在当今这个视觉至上的时代,用户界面(UI)的设计对于任何软件产品来说都至关重要。一个美观、直观且易于使用的界面不仅能够提升用户体验,还能增强品牌形象,甚至在某些情况下,成为产品成功的关键因素之一。在Qt框架中,QSS(Qt样式表)提供了一种类似于网页前端CSS的强大工具,允许开发者对应用程序的界面进行细致的美化和定制。本文将深入探讨QSS的基本概念、基本语法以及如何通过不同的方式设置样式,旨在帮助开发者更好地利用这一工具,打造出更加出色的用户界面。

1. 背景介绍

界面优化 -> 美化

  • 一个程序的界面是否好看,是否重要呢?
    有些面向专业领域的程序,界面好看与否,不是很关键,更关键的是实际效果。有些面向普通用户领域的程序,界面好看,还是很大的加分项。

QSS => 网页前端 CSS
能够针对界面“样式”来进行设置
包括不限于:大小、位置、颜色、背景、间距、字体…
CSS 的功能是非常强大,非常丰富。
QSS 要逊色一些,也可以完成很多工作。

有时候可以通过 QSS 设置样式(设置字体属性,也可以通过 C++ 代码设置样式)。如果两者冲突,QSS 优先级更高。

2. 基本语法

对于 CSS 来说,基本语法结构非常简单

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

选择器:先选择某个控件/莫一类控件,接下来进行的各种属性的设置,都是针对控件生效的。
键值对:针对某些样式具体的设置了。

例如:

QPushButton { color : red; }

或者:

QPushButton { color : red; 
}

上述代码的含义表示,针对界面上所有的 QPushButton,都把文本设置为红色。

设置样式的时候,是可以指定某个控件来设置的。
指定控件之后,此时的样式就会指定的控件,也会正对子控件生效。

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

由于 QPushButton 没有子控件了,可以设置给QWidget

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

这样就可以同时给不同按钮设了。
在这里插入图片描述

在这里会针对 this 的子控件生效,既要考虑子控件,也是要和选择器相关的

// 在 main.cpp 中设置全局样式
#include "widget.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);a.setStyleSheet("QPushButton { color: red; }");Widget w;w.show();return a.exec();
}

3. QSS 设置方式

3.1. 设置全局样式

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

  1. 如果设置了全局样式,然后在某个控件里又设置了其它样式,会咋样?
// widget.cpp
#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: 50px; }");
}Widget::~Widget()
{delete ui;
}

在这里插入图片描述
此时这两方面的样式,会“叠加”起来

  1. 如果设置了全局样式,在某个控件里设置的样式和全局样式冲突了,又会咋样?
ui->pushButton_2->setStyleSheet(" QPushButton {color: green; }");

在这里插入图片描述
当全局样式和局部样式冲突的时候,局部样式的优先级是更高的,覆盖了对应的全局样式。
实际开发中,就可以在全局样式中设置比较通用的样式,统一整个系统的界面风格,如果需要针对某个控件进行微调,可以使用局部样式来 做出调整。

3.2. 从文件加载样式表

QSS 上述代码中,样式代码 和 C++代码都是混在一起的。

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

如果 QSS 样式代码比较简单,无所谓了;如果 QSS 代码非常复杂,继续这样搞,代码维护成本就很高了。
就可以把样式代码拎出来,放到单独的文件中。后续可以让 C++ 代码来读取并加载文件内容。

  1. 创建 qrc 文件,通过 qrc 文件管理样式文件
  2. 创建单独的 qss 文件,把这样的文件放到 qrc 中
    用记事本新建一个 qss 文件:
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

  1. 编写 C++ 代码,读取 qss 文件中的类容,并设置样式
// 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();
}

这个方案仅供大家参考,实际开发中还有更方便的方案。

3.3. 使用 Qt Designer 编辑样式

在 Qt Designer 中直接继承了这样的功能,允许我们把样式直接写到 .ui 文件里。
.ui 文件中直接点击 改变样式表,就可以直接编写界面样式了,这里进行的修改都会记录到 ui 文件中,并且在程序运行时自动生效,而且这里还能进行预览。
在这里插入图片描述
在这里插入图片描述
在 xml 文件中就 可以看到 记录了当前编辑的样式,后续 Qt 根据 ui 文件生成 C++代码,也就会同时把样式设置进去。
在这里插入图片描述

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

  1. 全局样式 (QApplication 设置的)
  2. 指定控件的样式(这个控件是否设置了样式)
  3. 指定控件的父控件的样式(可能是从父控件中继承过来的)
  4. qss 文件中的样式
  5. ui 文件中的样式

实际开发中,如果需要设置样式,建议最好统一使用某一种方式来设置。

总结:

本文详细介绍了Qt样式表(QSS)的基本概念、语法结构以及多种设置方式,包括全局样式的设置、从文件加载样式表以及使用Qt Designer进行样式编辑。通过这些方法,开发者可以根据需要灵活地定制应用程序的界面,从而提升用户体验和产品的整体吸引力。同时,文章也指出了在实际开发中,由于样式设置的灵活性,可能会导致样式冲突和排查困难的问题,因此建议开发者在项目中统一使用一种样式设置方法,以保持界面风格的一致性和可维护性。通过本文的学习,希望开发者能够更加熟练地运用QSS,打造出既美观又实用的用户界面。

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

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

相关文章

智能制造案例专题|与MongoDB一起解锁工业4.0转型与增长的无限潜力!

MongoDB 智能制造 数字化技术的洪流在各个产业链的主干和枝节涌现。在工业制造领域&#xff0c;能否通过数字化技术实现各生产要素、生产环节之间的紧密配合&#xff0c;高效规划、管理整个生产流程&#xff0c;是企业提升韧性、赢得竞争的关键。随着工业4.0的深入发展和智能…

高级Java开发者的自我修养:深入剖析JVM垃圾回收机制及面试要点

在探索Java虚拟机&#xff08;JVM&#xff09;的奥秘过程中&#xff0c;垃圾回收机制&#xff08;GC&#xff09;是一个不可或缺的话题&#xff0c;尤其在面对大型应用和系统优化时显得尤为重要。JVM的自动内存管理是Java编程语言中一项革命性的特性&#xff0c;它大大简化了程…

AI盒子在智慧加油站的应用

方案背景 为规范加油站作业&#xff0c;保障人民生命财产安全&#xff0c;《加油站作业安全规范》&#xff08;AQ 3010-2007&#xff09;中第五条规定&#xff1a;卸油作业基本要求&#xff0c;明确防静电、防雷电、防火、人员值守、禁止其他车辆及非工作人员进入卸油区。 痛点…

RocketMQ学习(2) 深入学习

RokcetMQ的介绍和基础知识见这篇博客——RocketMQ学习(1) 快速入门 本篇为上一篇的深入学习&#xff0c;很多基础知识不再赘述。 目录 消息重复消费问题(去重;幂等)布隆过滤器 重试机制死信消息 SpringBoot集成RocketMQ集成SpringBoot发送不同消息模式(同步消息)异步消息单向消…

使用el-tab,el-tab-pane循环使用循环后不显示下划线问题

在vue项目中使用element-UI el-tab里的el-tab-pane是循环出来的&#xff0c;但是循环出来后选中tab不显示下划线了 文章目录 问题问题展示效果问题代码问题原因 解决方案解决后效果解决方案1代码 解决方案2代码 问题 问题展示效果 问题代码 <el-tabs v-model"activeNa…

音量的对数表示与浮点数表示

音量用浮点数&#xff08;float&#xff09;和对数&#xff08;logarithmic scale&#xff09;表示各有特点和应用场景 浮点数&#xff1a;直接使用线性刻度表示音量&#xff0c;例如在0.0&#xff08;最小音量&#xff09;到1.0&#xff08;最大音量&#xff09;的范围内。对…

『 Linux 』缓冲区(万字)

文章目录 &#x1f9a6; 什么是缓冲区&#x1f9a6; 格式化输入/输出&#x1f9a6; 刷新策略&#x1fab6; 块缓冲(fully buffered)&#x1fab6; 无缓冲(unbuffered)&#x1fab6; 行缓冲(line buffered) &#x1f9a6; 现象解释&#x1f9a6; exit()与_exit()&#x1f9a6; 进…

list 的实现

目录 list 结点类 结点类的构造函数 list的尾插尾删 list的头插头删 迭代器 运算符重载 --运算符重载 和! 运算符重载 * 和 -> 运算符重载 list 的insert list的erase list list实际上是一个带头双向循环链表,要实现list,则首先需要实现一个结点类,而一个结点需要…

【代码随想录——回溯算法——四周目】

1.重新安排行程 1.1 我的代码&#xff0c;超时通不过 var (used []boolpath []stringres []stringisFind bool )func findItinerary(tickets [][]string) []string {sortTickets(tickets)res make([]string, len(tickets)1)path make([]string, 0)used make([]bool,…

JSON Web Token

JWT 什么是JWT JWT&#xff08;JSON Web Token&#xff09;是一种用于在各方之间作为JSON对象安全地传输信息的开放标准&#xff08;RFC 7519&#xff09;。该信息经过数字签名&#xff0c;因此是可验证和可信的。JWT 可以使用HMAC算法或使用RSA的公钥/私钥对进行签名 JWT的…

win10键盘按乱了,如何恢复?

今天键盘被宝宝给按乱了&#xff0c;好不容易给重新调整回来&#xff0c;记录备忘&#xff1a; 1、win10的asdf和方向键互换了&#xff1a; 使用Fnw键来回切换&#xff0c;OK&#xff01; 2、键盘的win键失效&#xff0c;例如&#xff1a;按winD无法显示桌面。此时&#xf…

电动汽车电子系统架构

电动汽车的普及正在稳步发展&#xff0c;供应链的各个环节也在发生变化。它涵盖了制造电动汽车零件的原材料、化学品、电池和各种组件。与此同时&#xff0c;汽车充电基础设施也参与其中&#xff0c;它们正经历一个历史性的阶段&#xff0c;经过彻底的重新设计。它们的电气化以…

Wpf 使用 Prism 实战开发Day30

登录界面设计 一.准备登录界面图片素材&#xff08;透明背景图片&#xff09; 1.把准备好的图片放在Images 文件夹下面&#xff0c;格式分别是.png和.ico 2.选中 login.png图片鼠标右键&#xff0c;选择属性。生成的操作选择>资源 3.MyTodo 应用程序右键&#xff0c;属性&a…

如何修改开源项目中发现的bug?

如何修改开源项目中发现的bug&#xff1f; 目录 如何修改开源项目中发现的bug&#xff1f;第一步&#xff1a;找到开源项目并建立分支第二步&#xff1a;克隆分支到本地仓库第三步&#xff1a;在本地对项目进行修改第四步&#xff1a;依次使用命令行进行操作注意&#xff1a;Gi…

地质灾害位移应急监测站

地质灾害位移应急监测站是一种专门用于地质灾害预警和应急响应的设施&#xff0c;它能够实时监测和分析山体、建筑物、管道等的位移变化情况。以下是关于地质灾害位移应急监测站的详细介绍&#xff1a; 主要组成部分 传感器&#xff1a;安装于需要监测的位置&#xff0c;用于…

RK3588+FPGA+AI高性能边缘计算盒子,应用于视频分析、图像视觉等

搭载RK3588&#xff08;四核 A76四核 A55&#xff09;&#xff0c;CPU主频高达 2.4GHz &#xff0c;提供1MB L2 Cache 和 3MB L3 &#xff0c;Cache提供更强的 CPU运算能力&#xff0c;具备6T AI算力&#xff0c;可扩展至38T算力。 产品规格 系统主控CPURK3588&#xff0c;四核…

GUI 02:布局管理器相关知识,AWT 的 3 种布局管理器应用,以及嵌套布局的使用

一、前言 记录时间 [2024-05-31] 前置文章 GUI 01&#xff1a;GUI 编程概述&#xff0c;AWT 相关知识&#xff0c;Frame 窗口&#xff0c;Panel 面板&#xff0c;及监听事件的应用 本文讲述了 GUI 编程种布局管理器的相关知识&#xff0c;以及 AWT 的 3 种布局管理器——流式布…

【FPGA】Verilog语言从零到精通

接触fpga一段时间&#xff0c;也能写点跑点吧……试试系统地康康呢~这个需要耐心但是回报巨大的工作。正原子&&小梅哥 15_语法篇&#xff1a;Verilog高级知识点_哔哩哔哩_bilibili 1Verilog基础 Verilog程序框架&#xff1a;模块的结构 类比&#xff1a;c语言的基础…

P3881

最小值最大 二分&#xff1a;枚举两个牛之间的最小距离&#xff0c;左端点是1&#xff0c;右端点是篱笆总长度。 Check数组&#xff1a; 如果两头牛之间距离是Mid不合法&#xff0c;则返回0&#xff08;false&#xff09;&#xff1b; 如果两头牛之间距离是Mid合法&#xf…

去噪扩散概率模型在现代技术中的应用:图像生成、音频处理到药物发现

去噪扩散概率模型&#xff08;DDPMs&#xff09;是一种先进的生成模型&#xff0c;它通过模拟数据的噪声化和去噪过程&#xff0c;展现出多方面的优势。DDPMs能够生成高质量的数据样本&#xff0c;这在图像合成、音频生成等领域尤为重要。它们在数据去噪方面表现出色&#xff0…