[Qt] Box Model | 控件样式 | 实现log_in界面

目录

1、样式属性

(1)盒模型(Box Model)

2、控件样式示例

(1)按钮

(2)复选框

(3)单选框

(4)输入框

(5)列表

【理解渐变色】

(6)菜单栏

(7)登录界面

3、小结


1、样式属性

QSS 中的样式属性非常多,大部分的属性和 CSS 是非常相似的。

  • 文档的 Qt Style Sheets Reference 章节详细介绍了哪些控件可以设置属性,每个控件都能设置哪些属性等。

相关的代码示例,在后面具体介绍。在翻阅文档的时候涉及到一个关键术语 “盒模型”(Box Model)。


(1)盒模型(Box Model)

在文档的 Customizing Qt Widgets Using Style Sheets 的 The Box Model 章节介绍了盒模型:

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

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

默认情况下,外边距、内边距、边框宽度都是 0。

可以通过一些 QSS 属性来设置上述的边距和边框的样式:

QSS 属性

说明

margin

设置四个方向的外边距。复合属性。

padding

设置四个方向的内边距。复合属性。

border-style

设置边框样式

border-width

边框的粗细

border-color

边框的颜色


【设置边框和内边距】

A. 在界面上创建一个 label

B. 修改 main.cpp, 设置全局样式

  • border: 20px solid green 相当于 border-style: solid; border-width: 2px; border-color: green; 三个属性的简写形式。
  • padding-left: 50px; 是给左侧设置内边距。

C. 运行程序


【设置外边距】

为了方便确定控件位置,演示外边距效果,使用代码创建⼀个按钮。

A. 修改 widget.cpp,创建按钮,并设置样式

B. 运行程序

可以看到,当前按钮的边框被外边距挤的缩小了,但是获取到的按钮的 Geometry 是不变的。


2、控件样式示例

(1)按钮

【自定义按钮】

A. 界面上创建一个按钮

B. 右键 -> 改变样式表,使用 Qt Designer 设置样式

C. 执行程序

  • 点击 “按钮”:

D. 属性小结

属性

说明

font-size

设置文字大小。

border-radius

设置圆角矩形。
数值设置的越大,角就越圆。

background-color

设置背景颜色。

形如 #dadbde 是计算机中通过十六进制表示颜色的方式。


(2)复选框

【自定义复选框】

A. 创建一个 resource.qrc 文件,并导入以下图片

  • 使用黑色作为默认形态
  • 使用蓝色作为 hover 形态
  • 使用红色作为 pressed 形态

注意这里的文件命名。

B. 创建一个复选框

C. 编辑复选框的样式

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

D. 运行程序

鼠标点击选中,再取消的过程,可以看到此时的复选框就变得丰富起来了:

E. 小结

要点

说明

::indicator

子控件选择器。
选中 checkbox 中的对钩部分。

:hover

伪类选择器。
选中鼠标移动上去的状态。

:pressed

伪类选择器。
选中鼠标按下的状态。

:checked

伪类选择器。
选中 checkbox 被选中的状态。

:unchecked

伪类选择器。
选中 checkbox 未被选中的状态。

width

设置子控件宽度。
对于普通控件无效(普通控件使用 geometry 方式设定尺寸)。

height

设置子控件高度。
对于普通控件无效(普通控件使用 geometry 方式设定尺寸)。

image

设置子控件的图片。
像 QSpinBox, QComboBox 等可以使用这个属性来设置子控件的图片。


(3)单选框

【自定义单选框】

A. 创建 resource.qrc 文件,并导入以下图片

  • 使用黑色作为默认形态
  • 使用蓝色作为 hover 形态
  • 使用红色作为 pressed 形态

注意这里的文件命名。

B. 在界面上创建两个单选按钮

要点

说明

::indicator

子控件选择器。
选中 radioButton 中的对钩部分。

:hover

伪类选择器。
选中鼠标移动上去的状态。

:pressed

伪类选择器。
选中鼠标按下的状态。

:checked

伪类选择器。
选中 radioButton 被选中的状态。

:unchecked

伪类选择器。
选中 radioButton 未被选中的状态。

width

设置子控件宽度。
对于普通控件无效(普通控件使用 geometry 方式设定尺寸)。

height

设置子控件高度。
对于普通控件无效(普通控件使用 geometry 方式设定尺寸)。

image

设置子控件的图片。
像 QSpinBox, QComboBox 等可以使用这个属性来设置子控件的图片。

C. 在 Qt Designer 中编写样式

  • 此处为了让所有 QRadioButton 都能生效,把样式设置在 Widget 上了,并且使用后代选择器选中了 QWidget 里面的 QRadioButton。

注意 :

  • QSS 中有些属性,子元素能继承父元素(例如 font-size、color 等),但是也有很多属性是不能继承的。
  • 具体哪些能继承哪些不能继承,规则比较复杂,我们不去具体研究,实践中我们编写更精准的选择器是上策。
 QWidget QRadioButton {font-size: 20px;
}QWidget QRadioButton::indicator {width: 20px;height: 20px;
}QWidget QRadioButton::indicator:unchecked {image: url(:/radio-unchecked.png);
}QWidget QRadioButton::indicator:unchecked:hover {image: url(:/radio-unchecked_hover.png);
}QWidget QRadioButton::indicator:unchecked:pressed {image: url(:/radio-unchecked_pressed.png);
}QWidget QRadioButton::indicator:checked {image: url(:/radio-checked.png);
}QWidget QRadioButton::indicator:checked:hover {image: url(:/radio-checked_hover.png);
}QWidget QRadioButton::indicator:checked:pressed {image: url(:/radio-checked_pressed.png);
}

D. 运行程序


(4)输入框

【自定义单行编辑框】

A. 在界面上创建一个单行编辑框

B. 在 Qt Designer 中编写样式

QLineEdit {border-width: 1px; border-radius: 10px;border-color: rgb(58, 58, 58);border-style: inset;padding: 0 8px;color: rgb(255, 255, 255);background:rgb(100, 100, 100);selection-background-color: rgb(187, 187, 187);selection-color: rgb(60, 63, 65);
}

C. 执行程序

输入 "hello world",选中 "rld":

属性

说明

border-width

设置边框宽度。

border-radius

设置边框圆角。

border-color

设置边框颜色。

border-style

设置边框风格。

padding

设置内边距。

color

设置文字颜色。

background

设置背景颜色。

selection-background-color

设置选中文字的背景颜色。

selection-color

设置选中文字的文本颜色。


(5)列表

【自定义列表框】

A. 在界面上创建一个 ListView

操作详见前文:[Qt] 多元素控件 | 容器类控件 | 布局管理器layout

B. 编写代码

QListView::item:hover {background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,stop: 0 #FAFBFE, stop: 1 #DCDEF1);
}
QListView::item:selected {border: 1px solid #6a6ea9;background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,stop: 0 #6a6ea9, stop: 1 #888dd9);
}

C. 执行程序

要点

说明

::item

选中 QListView 中的具体条目。

:hover

选中鼠标悬停的条目

:selected

选中某个被选中的条目。

background

设置背景颜色

border

设置边框。

qlineargradient

设置渐变色。

对于渐变的理解:

qlineargradient 有 6 个参数。

  • x1, y1:标注了⼀个起点
  • x2, y2:标注了⼀个终点

这两个点描述了⼀个 “方向”

例如

  • 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 进行渐变的。


【理解渐变色】

A. 界面不创建任何控件

B. 编写样式

QWidget {background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop: 0 #fff, stop: 1 #000);
}

当前按照垂直从上往下从白色过渡到黑色。

C. 修改代码

QWidget {background-color: qlineargradient(x1:0, y1:0, x2:1, y2:0, stop: 0 #fff, stop: 1 #000);
}

当前按照水平从左往右从白色过渡到黑色。

执行效果:


(6)菜单栏

【自定义菜单栏】

A. 创建菜单栏

创建若干菜单项和一个分隔符:

B. 编写样式

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;
}

C. 执行效果

要点

说明

QMenuBar::item

选中菜单栏中的元素。

QMenuBar::item:selected

选中菜单栏中的被选中的元素。

QMenuBar::item:pressed

选中菜单栏中的鼠标点击的元素。

QMenu::item

选中菜单中的元素

QMenu::item:selected

选中菜单中的被选中的元素。

QMenu::separator

选中菜单中的分割线。


(7)登录界面

【基于上述学习过的 QSS 样式,制作一个美化版本的登录界面】

A. 在界面上创建元素,并使用布局管理器把相关元素包裹一下

  • 使用 QVBoxLayout 来管理上述控件。
  • 两个输入框和按钮的 minimumHeight 均设置为 50(元素在布局管理器中无法直接设置 width 和 height,使用 minimumWidth 和 minimumHeight 代替,此时垂直方向的 sizePolicy 要设为 fixed)。

  • 右键 QCheckBox,选择 Layout Alignment 可以设置 checkbox 的对齐方式(左对齐,居中对齐,右对齐)。

B. 设置背景图片

  • 把上述控件添加一个父元素 QFrame,并设置 QFrame 和窗口一样大。

  • 顶层窗口的 QWidget 无法设置背景图片,因此我们可以再套上一层 QFrame,背景图片就设置到 QFrame 上即可。

创建 resource.qrc,并导入图片:

编写 QSS 样式:

  • 使用 border-image 设置背景图片,而不是 background-image。
  • 主要是因为 border-image 是可以自动缩放的,这一点在窗口大小发生改变时是非常有意义的。
QFrame{border-image:url(:/537.jpg);
}

效果:

C. 编写 CSS 代码:

设置 checkbox 样式

  • 背景色使用 transparent 表示完全透明(应用父元素的背景)。
QFrame {border-image: url(:/537.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: #5555;border-style: outset;border-radius: 10px;
}QPushButton:pressed {color: black;background-color: #ced1db;border-style: inset;
}

运行程序效果:

最终完整样式代码,这些代码设置到 QFrame 的属性中即可。

通常我们建议把样式代码集中放置,方便调整和排查。


3、小结

QSS 本身给 Qt 提供了更丰富的样式设置的能力,但是整体来说 QSS 的功能是不如 CSS 的。

  • 在 CSS 中,整个网页的样式都是 CSS 一手负责,CSS 功能更强大,并且也更可控。
  • 相比之下,Qt 中是以原生 API 为主,来控制控件之间的尺寸、位置等,QSS 只是起到辅助的作用。
  • 而且 Qt 中提供的一些 “组合控件”(像 QComboBox、QSpinBox 等)内部的结构是不透明的,此时进行一些样式设置也会存在一定的局限性。

另外,做出好看的界面,光靠 QSS 是不够的,更重要的是需要专业美工做出设计稿。

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

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

相关文章

Golang Gin系列-6:Gin 高级路由及URL参数

在本章中,我们将深入研究使用Gin框架的高级路由和URL参数。我们将介绍如何创建和使用路由组、应用中间件、提取路径参数、处理查询字符串、处理静态文件以及使用HTML模板。 路由分组 为什么要使用路由组? 使用路由组有助于保持代码结构整洁有序。当路由…

【2025】拥抱未来 砥砺前行

2024是怎样的一年 2024在历史画卷上是波澜壮阔的一年,人工智能的浪潮来临,涌现出无数国产大模型。 22年11月ChatGPT发布,它的出现如同在平静湖面上投下一颗巨石,激起了层层波澜,短短五天用户数就达到了100万&#xff0…

FreeRTOS系统移植

前言 学习RTOS之前最重要的就是要学会将系统移植到单片机中,这里可以直接使用cubemx生成移植好的工程,也可以下载库来进行自己移植,这里我选择下载库来自己移植,因为这样可以配合Linux开发stm32单片机程序。 一、下载系统代码 …

MySQL 事务及MVCC机制详解

目录 什么是事务 事务的隔离级别 数据库并发的三种场景 读-写 什么是事务 事务就是一组DML语句组成,这些语句在逻辑上存在相关性,这一组DML语句要么全部成功,要么全部失败,是一个整体。MySQL提供一种机制,保证我们…

微服务学习-快速搭建

1. 速通版 1.1. git clone 拉取项目代码,导入 idea 中 git clone icoolkj-microservices-code: 致力于搭建微服务架构平台 1.2. git checkout v1.0.1版本 链接地址:icoolkj-microservices-code 标签 - Gitee.com 2. 项目服务结构 3. 实现重点步骤 …

arkime安装

这次试一下新的办法 先下载centOS 7 然后改成阿里云镜像 输入命令备份官方yum源配置文件 cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak 下载阿里云源配置,覆盖原文件 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirr…

/usr/bin/ssh-copy-id: ERROR: no identities found 解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

基于springboot+thymeleaf+Redis仿知乎网站问答项目源码

项目介绍 基于springbootthymeleafRedis仿知乎网站问答项目源码,可以作为毕业设计项目参考学习 按照需要一定动手能力 发文章,发视频,发想法,提问回答,注册登录 开发环境 使用技术:springbootthymeleafRe…

apisix的authz-casbin

目录 1、apisix的auth-casbin官方介绍 2、casbin介绍和使用 2.1基本知识: 2.2使用例子 3、配置插件 4、postman调用 5、auth-casbin的坑 1、apisix的auth-casbin官方介绍 authz-casbin | Apache APISIX -- Cloud-Native API Gateway 2、casbin介绍和使用 c…

自动驾驶之DriveMM: All-in-One Large Multimodal Model for Autonomous Driving

1. 写在前面 工作之后,主要从事于偏工程比较多的内容, 很少有机会读论文了,但2025年,由于之前有些算法的背景, 后面可能会接触一些多模态大模型相关的工作,所以又调头有点往算法的方向偏移, 而算法呢,很重要的一点就是阅读论文。2025年,再拾起论文这块的工作。 今天…

BGP分解实验·9——路由聚合与条件性通告(1)

路由聚合是有效控制缩减BGP路由表的方法之一,路由聚合的前提和IGP一样,需要有路由目标存在BGP表中,与IGP不同的是,BGP路由聚合可以定义按需抑制路由的能力。 实验拓扑如下所示: 现在开始把从R1的R5的基础配置先准备好…

Linux C\C++方式下的文件I/O编程

【图书推荐】《Linux C与C一线开发实践(第2版)》_linux c与c一线开发实践pdf-CSDN博客 《Linux C与C一线开发实践(第2版)(Linux技术丛书)》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 Lin…

C语言:位段

位段的内存分配: 1. 位段的成员可以是 int unsigned int signed int 或者是char (属于整形家族)类型 2. 位段的空间上是按照需要以4个字节( 类型 int )或者1个字节( char )的方式来开辟的。 3. 位段涉及…

C++实现矩阵Matrix类 实现基本运算

本系列文章致力于实现“手搓有限元,干翻Ansys的目标”,基本框架为前端显示使用QT实现交互,后端计算采用Visual Studio C。 目录 Matrix类 1、public function 1.1、构造函数与析构函数 1.2、获取矩阵数值 1.3、设置矩阵 1.4、矩阵转置…

HTML<form>标签

例子 具有两个输入字段和一个提交按钮的HTML表单&#xff1a; <form action"/action_page.php" method"get"> <label for"fname">First name:</label> <input type"text" id"fname" name"f…

《贪心算法:原理剖析与典型例题精解》

必刷的贪心算法典型例题&#xff01; 算法竞赛&#xff08;蓝桥杯&#xff09;贪心算法1——数塔问题-CSDN博客 算法竞赛&#xff08;蓝桥杯&#xff09;贪心算法2——需要安排几位师傅加工零件-CSDN博客 算法&#xff08;蓝桥杯&#xff09;贪心算法3——二维数组排序与贪心算…

【2024 年度总结】从小白慢慢成长

【2024 年度总结】从小白慢慢成长 1. 加入 CSDN 的契机2. 学习过程2.1 万事开头难2.2 下定决心开始学习2.3 融入技术圈2.4 完成万粉的目标 3. 经验分享3.1 工具的选择3.2 如何提升文章质量3.3 学会善用 AI 工具 4. 保持初心&#xff0c;继续前行 1. 加入 CSDN 的契机 首次接触…

【C++篇】红黑树封装 实现map和set

目录 前言&#xff1a; 一&#xff0c;库中map和set的大致结构 二&#xff0c;模拟实现 2.1&#xff0c;大致框架 2.2&#xff0c;复用红黑树实现insert接口 2.3&#xff0c;迭代器iterator的实现 operator()的实现&#xff1a; operator--()的实现&#xff1a; 对inser…

写作利器:如何用 PicGo + GitHub 图床提高创作效率

你好呀&#xff0c;欢迎来到 Dong雨 的技术小栈 &#x1f331; 在这里&#xff0c;我们一同探索代码的奥秘&#xff0c;感受技术的魅力 ✨。 &#x1f449; 我的小世界&#xff1a;Dong雨 &#x1f4cc; 分享我的学习旅程 &#x1f6e0;️ 提供贴心的实用工具 &#x1f4a1; 记…

RabbitMQ 高级特性

目录 1.消息确认 1.1 消息确认机制 1.2 手动确认方法 1. 2.1肯定确认 1.2.2 否定确认 1.3 SpringBoot 代码示例 1.3.1 配置确认机制 1.3.2 配置队列,交换机,绑定关系 1.3.3 生产者(向 rabbitmq 发送消息) 1.3.4 消费者(消费队列中的信息) 2.持久性 2.1 交换机…