python3 pyside6图形库学习笔记及实践(三)
目录
- 前言
- 菜单栏
- 相关控件
- 使用QtDesigner快速构建菜单栏
- 结构语法
- 上下文菜单
- 概念
- 为窗体添加上下文菜单
- 为控件添加上下文菜单
- 折叠菜单
- 资源的加载
- 内置图标
- Rcc的使用
- 创建资源文件
- 加载资源文件
前言
本系列文章为b站PySide6教程以及官方文档的学习笔记
原视频传送门:【已完结】PySide6百炼成真,带你系统性入门Qt
官方文档链接:Qt for Python
菜单栏
相关控件
- QMenuBar: 这是最顶层的菜单栏控件,通常位于窗口的顶部。它作为容纳多个菜单(
QMenu对象)的容器。一个标准的桌面应用程序通常有一个菜单栏,包含如“文件”、“编辑”、“视图”等标准菜单。 - QMenu: 这个控件代表菜单栏中的一个单独菜单,例如“文件”菜单。每个
QMenu对象可以包含多个QAction对象,这些对象代表具体的命令或选项,如“打开”、“保存”、“退出”等。 - QAction: 这是代表具体操作的控件。它可以是菜单项、工具栏按钮或者是键盘快捷键的触发器。通过
QAction,我们可以定义当用户点击菜单项或按下快捷键时应该执行的动作。
它们的逻辑关系是这样的:QMenuBar 包含多个 QMenu,每个 QMenu 包含多个 QAction。用户通过点击 QAction 来触发具体的功能。
当我们想为窗体添加菜单栏时,窗体类型必须是QMainWindow
菜单栏中的菜单可以出现嵌套关系,即一个菜单中除了操作外还有子菜单
在日常使用的软件中经常会出现这种情况
使用QtDesigner快速构建菜单栏

当我们在QtDesigner在创建一个MainWindow窗口时,顶部会自动放置一个菜单栏
点击编辑栏后即可开始往菜单栏中添加菜单,输入完毕需要敲回车键确认

当我们添加了一个菜单之后,我们可以选择点击右边的编辑栏继续向菜单栏添加菜单,或者点击当前菜单下方的编辑栏,向当前菜单中添加子菜单或操作
菜单中的子菜单在QtDesigner中只能输入英文,如果想要输入中文,可以在属性中设置

点击操作项右边的拓展图标,我们可以将其变为子菜单

接着我们就能在该子菜单中添加操作和子菜单

分隔符在菜单栏的设计中通常是用来将菜单中的不同功能分隔开,使其更加美观,所以说其实可有可无
在动作编辑器中,我们可以为具体操作配置图标和快捷键

当然,我们还可以通过右键窗口来添加工具栏

可以直接将已有操作拖入工具栏

结构语法
在设计时,我们一般是先想到有哪些菜单需要实现,再去详细设计这些菜单下的操作
但是在编写代码时,我们需要自底向上,先将操作/子菜单添加到菜单,再将菜单添加到菜单栏
class MyWindow(QMainWindow):def __init__(self):super().__init__()self.menu = self.menuBar()self.openFile = QAction('打开文件')self.closeFile = QAction('关闭文件')self.moreMenu = QMenu('更多')self.more1 = QAction('更多1')self.more2 = QAction('更多2')self.moreMenu.addAction(self.more1)self.moreMenu.addAction(self.more2)self.fileMenu = QMenu('文件')self.fileMenu.addAction(self.openFile)self.fileMenu.addAction(self.closeFile)self.fileMenu.addMenu(self.moreMenu)self.menu.addMenu(self.fileMenu)self.mainlayout = QVBoxLayout()self.setLayout(self.mainlayout)
我们使用addAction()方法将操作添加到菜单中
使用addMenu()方法可以将子菜单添加到菜单中,或将菜单添加到菜单栏中
同时我们也可以将操作项的triggered信号绑定到槽
self.openFile.triggered.connect(lambda: print('打开文件'))
self.closeFile.triggered.connect(lambda: print('关闭文件'))
self.more1.triggered.connect(lambda: print('更多1'))
上下文菜单
概念
上下文菜单即我们在应用程序中右键点出的菜单

这里贴一张Edge浏览器的上下文菜单截图,可以发现与我们的普通菜单的元素非常相似
事实上在代码实现上,上下文菜单的实现逻辑也和菜单栏和相似
为窗体添加上下文菜单
我们可以为窗体本身或者控件添加上下文菜单
先来介绍如何给窗体本身添加
将窗体想象为一个菜单,那么我们就可以向其中添加子菜单和操作
但是在添加之前,我们需要先设置上下文菜单策略
from PySide6.QtCore import Qt
self.setContextMenuPolicy(Qt.ContextMenuPolicy.ActionsContextMenu)
接下来我们直接使用窗体本身的addAction()方法来添加菜单项
self.addAction(self.openFile)
self.addAction(self.closeFile)
添加菜单项时,也可以使用更简洁的列表添加
self.addActions([self.openFile,self.closeFile])
为控件添加上下文菜单
其实许多控件本身是自带上下文菜单的
当我们在页面中添加一个编辑框并右击它时,会出现如下的上下文菜单

包括重做、恢复、复制、粘贴等对输入内容的基本操作
当然,我们也可以修改这个默认的上下文菜单,向其中添加自定义操作
首先我们还是需要为控件设置上下文菜单策略
self.lineEdit1.setContextMenuPolicy(Qt.ContextMenuPolicy.ActionsContextMenu)
接下来我们对控件使用addActions()方法来添加菜单项
self.sendValue = QAction('发送值到输入框2')
self.showCurrentValue = QAction('显示当前值')
self.lineEdit1.addActions([self.sendValue, self.showCurrentValue])
最后我们可以为这两个操作绑定逻辑
self.sendValue.triggered.connect(lambda: self.lineEdit2.setText(self.lineEdit1.text()))self.showCurrentValue.triggered.connect(lambda: print(self.lineEdit1.text()))
折叠菜单
首先规划选项卡中的布局和内容
这里我们写两个选项卡用于演示
#创建折叠选项卡内容
self.widget1 = QWidget()
self.widget1Layout = QVBoxLayout()
self.widget1Layout.addWidget(QLabel('这是第一个选项卡'))
self.widget1Layout.addWidget(QPushButton('按钮1'))
self.widget1.setLayout(self.widget1Layout)self.widget2 = QWidget()
self.widget2Layout = QVBoxLayout()
self.widget2Layout.addWidget(QLabel('这是第二个选项卡'))
self.widget2Layout.addWidget(QPushButton('按钮2'))
self.widget2.setLayout(self.widget2Layout)
接下来我们创建折叠窗QToolBox,并将选项卡用addItem方法置入
self.toolBox = QToolBox()
self.toolBox.addItem(self.widget1, '选项卡1')
self.toolBox.addItem(self.widget2, '选项卡2')self.mainlayout = QVBoxLayout()
self.mainlayout.addWidget(self.toolBox)
self.setLayout(self.mainlayout)
效果如下

当然我们也可以加上图标
# 创建一个右箭头图标和一个下箭头图标
self.arrowRight = self.style().standardIcon(QStyle.StandardPixmap.SP_ArrowRight)
self.arrowDown = self.style().standardIcon(QStyle.StandardPixmap.SP_ArrowDown)self.toolBox = QToolBox()
self.toolBox.addItem(self.widget1, self.arrowDown,'选项卡1')
self.toolBox.addItem(self.widget2, self.arrowRight,'选项卡2')
self.toolBox.currentChanged.connect(self.changeArrow)...def changeArrow(self, index):# 全部重置为右箭头for i in range(self.toolBox.count()):self.toolBox.setItemIcon(i, self.arrowRight)# 当前选项卡设置为下箭头self.toolBox.setItemIcon(index, self.arrowDown)
效果如下

资源的加载
内置图标
PySide6提供了一组内置的图标,我们可以在应用程序中使用这些图标来美化界面或者作为按钮、工具栏等控件的图标。
我们可以通过QStyle类中的standardIcon()方法来访问这些内置图标。
以下是一些常用的内置图标:
SP_ArrowUp: 向上箭头SP_ArrowDown: 向下箭头SP_ArrowLeft: 向左箭头SP_ArrowRight: 向右箭头SP_DialogOkButton: 对话框确认按钮SP_DialogCancelButton: 对话框取消按钮SP_FileIcon: 文件图标SP_DirIcon: 文件夹图标SP_ComputerIcon: 计算机图标
要使用这些内置图标,首先需要导入 QStyle 类
from PySide6.QtWidgets import QStyle
在窗口初始化时我们需要获取图标对象
self.okIcon = self.style().standardIcon(QStyle.StandardPixmap.SP_DialogOkButton)
最后我们可以将这些图标对象直接应用到需要的控件上
okButton = QPushButton("OK")
okButton.setIcon(self.okIcon)
Rcc的使用
当我们打包软件时,一般只有py文件或者是一些源码和环境被打包进exe,而资源文件仍然存在指定目录下的文件夹下
这样往往会显得软件较为臃肿,还容易将资源文件误删
我们可以使用Rcc来将各种资源文件(图像、视频、数据库等)转成py文件,和代码一块打包
在PySide6中,**RCC(Resource Compiler)**是一个用于将资源文件(如图像、样式表等)编译成二进制格式的工具。编译后的资源文件可以嵌入到Python可执行文件中,以便在运行时轻松访问这些资源。
创建资源文件
我们可以使用Qt Designer来轻松创建和管理这些二进制资源文件
打开Qt Designer,我们可以点击菜单栏的视图>资源浏览器来开启资源视图

此时右下角会多出一个资源浏览器

点击左上角的编辑按钮,即可编辑资源

编辑界面中有三个需要关注的按钮,新建资源文件、添加前缀以及添加文件
这里我们可以将其类比于数据库
每个资源文件,即一个二进制py文件,可以看作是一个库,我们在项目中可以引入这些资源库
而前缀即库中的一些表,可以当作子目录,我们可以将相同类型的资源文件添加到相同前缀中
而文件即具体的资源文件,作为前缀中的一些的表项

创建完毕后,我们在vscode中找到生成的qrc文件,右键该文件点击Compile进行编译

随后即可得到二进制py文件

加载资源文件
当我们想加载得到的二进制资源文件中的资源时,可以直接在Qt Designer中可视化引用
例如我们添加一个按钮后,可以在属性编辑器中选择图标

点击选择资源,即可从我们创建的资源文件库中挑选资源


当然,我们也可以在代码中加载资源
首先引用资源文件库
import test_rc
接着我们可以通过特殊的路径引用方法使用库中的资源创建图标,即:/前缀/路径
check_yes_icon = QIcon()
check_yes_icon.addFile(u":/icons/icons/check_yes.png", QSize(), QIcon.Normal, QIcon.Off)
需要注意的是,这里的路径中,前一个icons为前缀名,而后面的icons/check_yes.png为一开始创建资源文件时,该资源相对于资源文件库的路径
所以其实为了更便捷地引用,在一开始创建资源库时,最好这些资源和库文件放在同一目录下
相关文章:
python3 pyside6图形库学习笔记及实践(三)
目录 前言菜单栏相关控件使用QtDesigner快速构建菜单栏结构语法 上下文菜单概念为窗体添加上下文菜单为控件添加上下文菜单 折叠菜单资源的加载内置图标Rcc的使用创建资源文件加载资源文件 前言 本系列文章为b站PySide6教程以及官方文档的学习笔记 原视频传送门:【…...
03 库的操作
目录 创建查看修改删除备份和恢复查看连接情况 1. 创建 语法 CRATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] …] create_specification: CHARACTER SET charset_name CPLLATE collation_name 说明: 大写的标识关键…...
嵌入式人工智能(44-基于树莓派4B的扩展板-LED按键数码管TM1638)
树莓派性能非常强悍,但是对于某些复杂的项目来说,会出现心有余而口不足的情况,为了解决这类问题,可以在树莓派上使用扩展板,我们介绍几款常见的扩展板,不仅可以扩展到树莓派,其他单片机或嵌入式…...
linux通过抓包工具tcpdump查看80端口访问量情况
方法: tcpdump -i ens32 -tn dst port 80 -c 10 | awk -F"." {print $1"."$2"."$3"."$4} | sort | uniq -c | sort -nr |head -n 10 #-i:指定端口 #-t:在输出的每一行不打印时间戳 #-nÿ…...
Mac 上安装和卸载 SDKMAN 及管理多个 JDK
前言 当电脑上有多个 JDK 环境的时候,切换管理比较麻烦,这时候可以使用 SDKMAN 来安装、管理 JDK。 一、安装 SDKMAN! 1. 安装前置条件 首先,确保已经安装了 curl 。如果没有,可以通过 Homebrew 来安装: brew inst…...
字节测开一面面经
1 . 自我介绍 2 . 讲一下常见的数据结构 : 讲了数组,set,list,map,树,图,队列 , 栈等 ; 3 . 讲一下java反射场景和作用 ; 4 . 讲一下你了解的机器学习算法 ; 5 . 我讲完ML之后 , 问了knn和贝叶斯的使用的场景区别(没答上来) ; 6 .…...
HTML 段落
HTML 段落 概述 HTML(超文本标记语言)是构建网页的标准语言,而段落是构成网页内容的基本单元。在HTML中,段落是通过<p>标签来定义的。本文将详细介绍HTML段落的相关知识,包括段落的基本结构、样式设置、以及在…...
【Mind+】掌控板入门教程04 迷你动画片
还记得小时候每天放学必看的动画片吗?还记得那些年陪伴我一起长大的卡通人物吗?勇救爷爷的葫芦娃,我们的朋友小哪吒,相信这些经典的动画形象已经成为了一代人童年的美好回忆。今天就让我们用掌控板来制作一部迷你动画片吧。 项目示…...
文件上传漏洞-HackBar使用
介绍 HackBar 是一个用于浏览器的扩展插件,主要用于进行网络渗透测试和安全评估。它提供了一系列方便的工具和功能,可以帮助用户执行各种网络攻击和测试,包括 XSS、SQL 注入、CSRF、路径穿越等 下载地址 可以到github上面去下载࿰…...
鸿蒙媒体开发【相机数据采集保存】音频和视频
相机数据采集保存 介绍 本示例主要展示了相机的相关功能,使用libohcamera.so 接口实现相机的预览、拍照、录像、前后置摄像头切换进行拍照、录像,以及对焦、曝光等控制类功能。 效果预览 使用说明 弹出是否允许“CameraSample”使用相机?…...
【java基础】徒手写Hello, World!程序
文章目录 前提:java环境变量配置使用vscode编写helloworld解析 前提:java环境变量配置 https://blog.csdn.net/xzzteach/article/details/140869188 使用vscode编写helloworld code .为什么用code看下图 报错了!!!&…...
对 vllm 与 ollama 的一些研究
今天咱们来聊聊 vllm 和 ollama 这两个听起来就挺酷的玩意儿。这俩都是现在 AI 圈子里的大明星,专门用来让那些超大型的 AI 模型跑得更顺溜。 先说说 vllm 吧,这家伙的绝活儿是剪枝。啥叫剪枝呢?想象一下,你有个花园,…...
浅谈基础的图算法——强联通分量算法(c++)
文章目录 强联通分量SCC概念例子有向图的DFS树代码例题讲解[POI2008] BLO-Blockade题面翻译题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 思路AC代码 【模板】割点(割顶)题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示…...
C#:通用方法总结—第13集
大家好,今天继续讲解我们的通用方法系列。 下面是今天要介绍的通用方法: (1)这个通用方法为ug获取选择圆边的圆心 /// <summary> /// ug获取选择圆边的圆心 /// </summary> /// <param name"a">&l…...
AI答题应用平台相关面试题
目录 1、请介绍整个系统后端的架构设计,有哪些模块以及各模块之间的关系? 2、你在项目中是如何设计库表的?可以从字段、索引、关联等方面回答。 3、为什么使用策略模式来封装不同的应用评分算法?它有哪些好处?具体如…...
树莓派NAS系统搭建教程:使用Flask和SQLite实现HTTP/HTTPS文件管理(代码示例)
一、项目概述 随着物联网(IoT)技术的发展,数据存储和共享需求日益增长。本文将介绍如何利用树莓派(Raspberry Pi)搭建一个网络附加存储(NAS)系统,以实现数据的集中管理、共享和访问…...
mysql如何储存大量数据,分库存分表的建议和看法
MySQL 在处理大量数据时,分库分表是常见的策略,可以有效提升数据库的性能和扩展性。下面是关于 MySQL 分库分表的建议和看法: 1. 何时考虑分库分表 数据量大:当单一数据库实例无法处理大规模数据或达到性能瓶颈时,可以…...
Golang | Leetcode Golang题解之第310题最小高度树
题目: 题解: func findMinHeightTrees(n int, edges [][]int) []int {if n 1 {return []int{0}}g : make([][]int, n)deg : make([]int, n)for _, e : range edges {x, y : e[0], e[1]g[x] append(g[x], y)g[y] append(g[y], x)deg[x]deg[y]}q : []i…...
【面试系列】软件架构师 高频面试题及详细解答
欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏: 工💗重💗hao💗:野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来:详细讲解AIGC的概念、核心技术、应用领域等内容。 ⭐…...
二百五十四、OceanBase——Linux上安装OceanBase数据库(四):登录ocp-express,配置租户管理等信息
一、目的 在部署OceanBase成功后,接下来就是登录ocp-express,配置租户管理等信息! 二、ocp-express网址以及账密信息 三、实施步骤 1 登录ocp-express 2 集群总览 3 租户管理 3.1 新建租户 3.2 配置新租户信息 剩下的几个模块了解即可&am…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
