压测工具开发实战篇(二)——构建侧边栏以及设置图标字体

在这里插入图片描述

你好,我是安然无虞。

文章目录

    • 构建侧边栏
      • QtAwesome使用
      • 调整侧边栏宽度
      • 了解: sizePolicy属性
      • 伪状态

在这里插入图片描述

在阅读本文之前, 有需要的老铁可以先回顾一下上篇文章:
压测工具开发(一)——使用Qt Designer构建简单界面

构建侧边栏

我们要实现类似于下面这样的侧边栏功能:

在这里插入图片描述
可以在 Qt Designer 中使用(containers)容器里的Frame容器, 拖到主窗口中即可:
在这里插入图片描述
要实现侧边栏中每一个功能按钮可以在Frame容器控件中添加所需数量的button按钮控件即可.

在这里插入图片描述
因为界面上需要容纳多个子窗口, 所以还需要使用容器里的MDI容器控件, 添加到主界面中:
在这里插入图片描述
我们将 侧边栏Frame容器设置为垂直布局, 再将包含侧边栏和MDI子窗口的控件设置为水平布局, 界面即可按预期显示:
在这里插入图片描述
如果我们想要让侧边栏的按钮设置为前面提到的图标模样, 该怎么做呢?

可以在 网上搜索 QtAwesome官网

QtAwesome使用

QtAwesome是一个Python库,用于在PyQt和PySide应用中使用图标字体.它支持多种图标系列,如msc、fa5等,允许用户自定义颜色、样式、动画效果.

这个网站上面还有QtAwesome的使用示例, 请试着理解.

关于 QtAwesome 的使用有一个重要的问题就是: 我怎么知道想用的图标对应的名字呢, 从哪里能看到呢?

如果是 Windows电脑可以在安装的QtAwesome目录下找到 qta-browser.exe可执行程序, 双击运行即可显示所有图标信息.

因为我用的是macOS系统电脑, 所以这里主要讲解macOS系统中的操作:
1.确保环境配置正确
确保你已经在 PyCharm 的虚拟环境中正确安装了 qtawesome 模块以及相关的依赖项(如PySide6)
如果尚未安装,可以通过以下命令安装:

pip install qtawesome pyside6

2.找到 icon_browser.py 文件
在 PyCharm 的虚拟环境中,qtawesome 模块通常安装在 site-packages 目录下.
可以通过以下方式找到 icon_browser.py 文件:
打开 PyCharm 的终端, 输入以下命令,找到 qtawesome 的安装路径:

python -c "import qtawesome; print(qtawesome.__file__)"

这将输出类似以下路径:

/path/to/your/virtualenv/lib/python3.x/site-packages/qtawesome/__init__.py

icon_browser.py 文件通常位于 qtawesome 模块的目录下,路径类似于:

/path/to/your/virtualenv/lib/python3.x/site-packages/qtawesome/icon_browser.py

3.运行 icon_browser.py
打开 PyCharm 的终端或命令行工具, 切换到 qtawesome 模块所在的目录:

cd /path/to/your/virtualenv/lib/python3.x/site-packages/qtawesome

运行 icon_browser.py 脚本:

python3 icon_browser.py

如果一切配置正确,icon_browser.py 将启动一个图形界面,显示所有可用的图标及其名称.

通过运行 icon_browser.py,你可以直观地查看 qtawesome 模块中所有可用的图标,并且可以直接复制图标名称用于你的项目中.

运行之后显示如下:
在这里插入图片描述
我们可以筛选自己想设置的图标系列以及名字, 比如想设置用户方面的图标, 就可以在搜索框中输入类似于 user 的文本进行查找即可.
在这里插入图片描述
好, 现在已经知道了图标对应的信息, 就可以在我们的PySide6程序中使用了.

我们将侧边栏中的第一个图标设置为客户端图标, 名字叫btn_client, 这个时候可以将其图标设置为刚刚搜索的fa5.user-circle:

import qtawesome as qta# 设置侧边栏图标 - qtawesome
self.ui.btn_client.setIcon(qta.icon('fa5.user-circle', color='SteelBlue'))
self.ui.btn_client.setIconSize(QSize(30, 30))

执行之后显示效果如下:
在这里插入图片描述
我们想把侧边栏宽度调整的小一些, 该怎么做呢?

调整侧边栏宽度

踩坑了, 这个我搞了半个多小时才找出来, 因为 Frame控件和MDI控件位于同一个水平布局中, 理论上只要调整这个父级水平布局中的 layoutStretch 属性即可, 主需要输入两个数值,分别表示 Frame 和 MDI Area 的宽度比例, 把Frame对应的数值调小一些即可, 像这样:
在这里插入图片描述
但是这样设置了之后, Frame控件并没有变化.

要解决这个问题可以设置Frame控件的的最小宽度以及MDI控件的水平拉伸策略改为Expanding, 使其自动填充剩余空间.
在这里插入图片描述
这样就可以解决问题了. 现在侧边栏的宽度就好看多了:
在这里插入图片描述

了解: sizePolicy属性

sizePolicy属性决定了控件对可用空间的“需求”和“适应方式”.

sizePolicy 的核心作用

当控件被放置在布局(如水平布局、垂直布局)中时,布局管理器会根据以下因素分配空间:

  1. 父窗口/容器的可用空间
  2. 控件自身的 sizeHint(建议大小)
  3. 控件的 minimumSize/maximumSize(最小/最大限制)
  4. sizePolicy(动态调整策略)

sizePolicy 会告诉布局管理器:

  • 控件是否希望被拉伸(例如填满剩余空间)
  • 控件是否希望保持固定大小
  • 如何与其他控件竞争空间

sizePolicy 的组成部分

sizePolicy 包含两个维度的策略和一个拉伸因子:

1.水平策略 (HorizontalPolicy): 定义控件在 水平方向 上的大小调整行为.

常见值:

  • Fixed: 固定宽度(严格使用 sizeHint)
  • Minimum: 宽度可以扩大,但不可小于 sizeHint
  • Maximum: 宽度可以缩小,但不可大于 sizeHint
  • Preferred: 优先使用 sizeHint,但可扩大或缩小
  • Expanding: 尽可能填满空间(主动抢占剩余空间)
  • Ignored: 完全忽略 sizeHint(根据布局强制调整)

2.垂直策略 (VerticalPolicy): 定义控件在 垂直方向 上的大小调整行为(与水平策略同理).

3.拉伸因子 (HorizontalStretch/VerticalStretch)
一个整数值(默认为 0),用于 控制控件在布局中的空间分配比例.

常见场景示例

场景 1:让按钮填满水平空间

设置按钮的 HorizontalPolicy 为 Expanding,它会自动拉伸以填满布局的剩余宽度.

场景 2:固定输入框宽度

设置输入框的 HorizontalPolicy 为 Fixed,宽度由 sizeHint 决定.

场景 3:按比例分配空间

两个控件的 HorizontalStretch 分别为 1 和 2,则它们的宽度比例为 1:2.

伪状态

现在想加一个小功能: 希望按钮在默认情况下没有边框, 当鼠标移动到图标上会显示边框, 并且会有背景色.

这个该怎么做呢?

我们点击 Frame 控件, 选择 styleSheet 属性, 设置想要的属性值即可.

在这里插入图片描述

这里的属性值我们这样设置:

QPushButton {border: none;
}QPushButton:hover {border: 1px solid yellow;background-color: Cornsilk;
}

对上面代码的解释:

  • QPushButton { border: none; }:当按钮处于正常状态时,不显示边框.
  • QPushButton:hover { border: 1px solid yellow; background-color: Cornsilk; }:当鼠标悬停在按钮上时,按钮的边框变为1像素宽的黄色实线,背景颜色变为Cornsilk(一种浅黄色)

设置好之后, 我们再来运行程序看看效果:
在这里插入图片描述
符合预期, 但是我们发现上面的Frame控件和MDI控件的周边(左边、右边和中间)都有间隙, 我们想去掉其中的间隙该怎么做呢?

由于 Frame控件和MDI控件 位于同一个水平布局中, 所以只需要调整外层的水平布局的Layout 对应的属性值即可.
在这里插入图片描述
按照上面设置后, 再运行看看效果:
在这里插入图片描述
ok, 没问题, 刚刚的间隙没有了.

现在还需要对侧边栏的图标控件添加一个小功能: 当鼠标移动到图标上时显示对应的名称, 比如鼠标移动到 btn_client 图标上会显示 客户端 的字样.

只需要点击对应的图标控件, 然后设置 toolTip 的值即可, 像这样:
在这里插入图片描述
现在就实现了前面提到的功能:
在这里插入图片描述

遇见安然遇见你,不负代码不负卿。
谢谢老铁的时间,咱们下篇再见~

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

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

相关文章

Axure RP9.0教程: 查询条件隐藏与显示(综合了动态面板状态切换及展开收缩效果实现)

文章目录 引言I 原型显示/隐藏搜索框思路步骤详细操作II 若依 ruoyi 显示/隐藏搜索框 & 显示隐藏列自定义设置显示隐藏列显示/隐藏搜索框引言 数据筛选有大量的查询条件时,可以选择查询隐藏效果。 I 原型显示/隐藏搜索框 综合了动态面板状态切换及展开收缩效果实现 思…

解锁工业通信:Profibus DP到ModbusTCP网关指南!

解锁工业通信:Profibus DP到ModbusTCP网关指南! 在工业自动化领域,随着技术的不断进步和应用场景的日益复杂,不同设备和系统之间的通讯协议兼容性问题成为了工程师们面临的一大挑战。尤其是在Profibus DP和Modbus/TCP这两种广泛应…

3维格式转换(二)

基于python的三维模型演化可视化 本项目的主要内容为总结了3种不同的可视化方案( trimesh + matplotlib 库、 pyvista 库、 vedo 库),并通过案例对可视化效果进行展示,最终通过模型动态演化案例给出最佳效果的可视化方案 本期结构图为 本期博客结构图 0 环境搭建 项目开…

docker导出image再导入到其它docker中

导出image docker save -o gxc_tenant.tar vue_tenant:1.0 eitc_tenant:1.0 redis:latest docker.io/mysql:8.0 minio/minio导入image docker load -i gxc_tenant.tar

Spring-IOC部分

Spring-IOC部分 1.SpringBean的配置详解(Bean标签) (1)scope 默认情况下,单纯的Spring环境Bean的作用范围有两个:Singleton和Prototype singleton:单例,默认值,Spring…

人工智能爬虫导致维基共享资源带宽需求激增 50%

2025 年 4 月 1 日,维基媒体基金会在博文中表示,自 2024 年 1 月以来,维基共享资源下载多媒体的带宽消耗激增 50%,这一变化趋势主要由用于 AI 训练数据集的网络爬虫导致。以下是具体分析1: 爬虫流量特征与数据存储模式…

2007-2019年各省地方财政交通运输支出数据

2007-2019年各省地方财政交通运输支出数据 1、时间:2007-2019年 2、来源:国家统计局、统计年鉴 3、指标:行政区划代码、地区、年份、地方财政交通运输支出 4、范围:31省 5、指标说明:地方财政交通运输支出是指地方…

【爬虫开发】爬虫开发从0到1全知识教程第14篇:scrapy爬虫框架,介绍【附代码文档】

本教程的知识点为:爬虫概要 爬虫基础 爬虫概述 知识点: 1. 爬虫的概念 requests模块 requests模块 知识点: 1. requests模块介绍 1.1 requests模块的作用: 数据提取概要 数据提取概述 知识点 1. 响应内容的分类 知识点&#xff1a…

【CMake】《CMake构建实战:项目开发卷》笔记-Chapter8-生成器表达式

第8章 生成器表达式 生成器表达式(generator expression)是由CMake生成器进行解析的表达式,因此,这些表达式只有在CMake的生成阶段才被解析为具体的值。 CMake在生成阶段,能够根据具体选用的构建系统生成器生成特定…

Docker安装、配置Mysql5.7

1.创建必要的目录 # 创建目录 mkdir -p ~/docker/software/mysql/{conf,log,data} 2.如果没有docker-compose.yml文件的话,先创建docker-compose.yml 配置文件一般长这个样子 version: 3services:mysql:image: mysql:5.7.36container_name: mysqlports:- "…

【C++学习笔记】十三、速通笔记

完整的C编程教程 目录 开发环境配置C知识体系现代C特性设计模式数据结构CMake项目构建调试技巧进阶主题学习资源 1. 开发环境配置 1.1 安装编译器 sudo apt-get install g build-essential1.2 安装构建工具 sudo apt-get install cmake1.3 VS Code配置 安装C扩展配置调试…

网络运维学习笔记(DeepSeek优化版)027 OSPF外部路由计算

文章目录 OSPF外部路由计算1. 实验拓扑与基础配置2. 关键配置命令2.1 引入静态路由2.2 查看路由表 3. LSA生成与传播分析3.1 ASBR角色通告(1类LSA)3.2 外部路由通告(5类LSA)3.3 外部路由引入过程 4. 5类LSA关键字段解析5. 外部路由…

【Python使用】嘿马推荐系统全知识和项目开发教程第2篇:1.4 案例--基于协同过滤的电影推荐,1.5 推荐系统评估【附代码

教程总体简介:1.1 推荐系统简介 学习目标 1 推荐系统概念及产生背景 2 推荐系统的工作原理及作用 3 推荐系统和Web项目的区别 1.3 推荐算法 1 推荐模型构建流程 2 最经典的推荐算法:协同过滤推荐算法(Collaborative Filtering) 3 …

运算放大器(五)电压比较器

比较器在最常用的简单集成电路中排名第二,仅次于排名第一的运算放大器。 电压比较器是一种用来比较输入信号电压与参考电压大小,并将比较结果以高电平或低电平形式输出的一种信号处理电路,广泛应用于各种非正弦波的产生和变换电路中&#xf…

Java面试黄金宝典34

1. 主键索引底层的实现原理 定义 主键索引是数据库中用于唯一标识表中每一行记录的索引,常见的底层实现是 B 树结构。B 树是一种平衡的多路搜索树,由内部节点和叶子节点组成。内部节点只存储索引键和指向下一层节点的指针,不存储实际数据&am…

Educational Codeforces Round 177 (Rated for Div. 2)

Educational Codeforces Round 177 (Rated for Div. 2) A. Cloudberry Jam 思路&#xff1a; 1千克果子能生产2/3千克果酱&#xff0c;生产3千克果酱则需要2千克果酱&#xff0c;所以*2即可 code: void solve() { int x; cin >> x;cout << 2 * x << e…

ARM-外部中断,ADC模数转换器

根据您提供的图片&#xff0c;我们可以看到一个S3C2440微控制器的中断处理流程图。这个流程图展示了从中断请求源到CPU的整个中断处理过程。以下是流程图中各个部分与您提供的寄存器之间的关系&#xff1a; 请求源&#xff08;带sub寄存器&#xff09;&#xff1a; 这些是具体的…

23种设计模式-行为型模式-迭代器

文章目录 简介问题解决代码设计关键点&#xff1a; 总结 简介 迭代器是一种行为设计模式&#xff0c;让你能在不暴露集合底层表现形式(列表、栈和树等)的情况下遍历集合中所有的元素。 问题 集合是编程中最常使用的数据类型之一。 大部分集合使用简单列表存储元素。但有些集…

Python 布尔类型

Python 布尔类型(Boolean) 布尔类型是Python中的基本数据类型之一&#xff0c;用于表示逻辑值。它只有两个值&#xff1a; True - 表示真False - 表示假 1. 布尔值的基本使用 # 定义布尔变量 is_active True is_admin Falseprint(is_active) # 输出: True print(is_admi…

人工智能在前端开发中的应用探索

一、人工智能在前端开发中的应用场景 人工智能&#xff08;AI&#xff09;技术的快速发展为前端开发带来了新的机遇和挑战。AI在前端开发中的应用主要集中在以下几个方面&#xff1a;智能代码生成、自动化测试、个性化推荐、智能交互设计以及性能优化。这些应用场景不仅提高了…