【Python_PySide6学习笔记(三十七)】清空QLayout中所有控件的方法

ops/2024/10/11 5:28:30/

清空QLayout中所有控件的方法

    • 清空QLayout中所有控件的方法
    • 前言
    • 正文
    • 1、takeAt()方法
    • 2、自定义f_clearLayoutFunc()方法
    • 3、setParent(None)方法

清空QLayout中所有控件的方法

前言

在 GUI 开发中,当我们使用 PySide6(或兼容的PyQt6)的 QVBoxLayout 或 QHBoxLayout 布局管理器来组织界面元素,包括控件、弹簧以及其他嵌套布局时,用户界面的动态性要求我们能够在用户操作后清空布局内的所有内容(如下图所示),并重新填充新的元素。
在这里插入图片描述

由于 QLayout 类没有内置一键清空所有子项的功能,必须采取一种手动的方法来实现这一需求。在本文中,将深入探讨并展示如何有效地清空 QLayout(无论是垂直布局还是水平布局)中的所有控件、子布局以及弹簧,为界面的重新布局和元素更新奠定坚实的基础。

正文

1、takeAt()方法

QLayout 类不仅没有一键清空所有子项的 clear() 方法,也没有移除 remove() 方法,经过在网上查阅的资料,大家普遍使用的是 takeAt() 结合 deleteLater() 的方法:

  • takeAt():用于从布局中移除并返回指定索引处的项(QLayoutItem),通常用于在迭代过程中动态地修改布局,比如移除布局中的某些组件。
  • deleteLater():安排一个对象在其事件循环的适当时间被删除,通常用于确保在对象不再需要时正确地释放资源,同时避免在删除过程中发生潜在的线程冲突或其他问题。

大致的用法如下:

python"># 获取布局中控件的数量
while layout.count():  # 从布局中移除第一个控件item = layout.takeAt(0) widget = item.widget()if widget:widget.deleteLater()

在实际使用时发现,使用这种方法,当再次添加时的控件布局与之前的布局一致时,不会有问题;可是当添加的布局比前一布局多时,发现多出的部分控件虽然会被删除(即通过layout.count()获取的数量确实为0),但 GUI 界面依然会显示
在这里插入图片描述

这里可能的原因是因为:QLayout 的操作都是通过 QLayoutItem 来实现的,QLayoutItem 可能包含 QWidget,也可能不包含 QWidget(如 QLayout、QSpacerItem 等),所以在使用 itemAt(i).widget().deleteLater() 删除前需要进行判断,否则可能会导致之前创建的 QWidget 残留在UI界面上。(个人分析,有不同意见或想法的读者欢迎在评论区留言)

2、自定义f_clearLayoutFunc()方法

所以后续的想法是:判断布局中移除的项是否是布局,如果不是布局,直接移除;如果是布局,则对布局中的控件再进行递归删除。

完整的代码如下:

python">    # 布局清空函数def f_clearLayoutFunc(self, layout):"""function:  布局清空函数in:  layout:要清空的布局;out:  Nonereturn:  Noneothers:  Layout Clear Func"""if layout is not None:while layout.count():# 从布局中移除第一个项# 注意:removeAt(0) 移除第一个项并返回它,但这里我们不需要返回项item = layout.takeAt(0)# 如果这个项是一个布局,我们也需要递归地清除它widget = item.widget()if widget is not None:# 移除控件的父布局,这也会删除控件(如果它是顶级窗口中的控件)# widget.setParent(None)widget.deleteLater()else:# 如果这个项不是一个控件(可能是一个布局或弹簧),我们也需要清除它# 注意:对于嵌套的布局,这里会递归地调用clear_layoutself.f_clearFrameFunc(item.layout())

3、setParent(None)方法

这里额外介绍下 setParent(None) 方法:

  • setParent(None) :在 PyQt 中,用于将一个对象从其父对象中分离出来。当一个对象被设置为没有父对象时,它变成了顶级窗口(如果它是一个窗口或窗口部件)或者一个自由浮动的对象(如果它不是窗口),这个操作不会立即删除对象,只是改变了它的父子关系。

    如果将一个窗口部件的父对象设置为 None,而这个窗口部件之前是一个非顶级窗口部件(即它有父窗口部件),那么这个窗口部件将不再显示(因为它不再是任何可见窗口部件的一部分),但它仍然存在于内存中,直到显式地删除它(比如通过调用它的 deleteLater() 方法)或者 Python 的垃圾回收机制回收它。

setParent(None) 与 deleteLater() 区别

  • deleteLater() :请求 Qt 在事件循环的下一个迭代中删除对象及其所有子对象,释放相关资源。
  • setParent(None) :将对象从其父对象中分离出来,但不立即删除它。如果对象是一个窗口部件,它可能不再可见,但仍然存在于内存中,直到被显式删除或垃圾回收。

在大多数情况下,如果想要删除一个对象及其子对象,应该使用 deleteLater()。如果只是想改变一个对象的父子关系(例如,将一个窗口部件从一个窗口移动到另一个窗口),则应该使用 setParent()。


http://www.ppmy.cn/ops/93073.html

相关文章

Vue-04.指令-v-if和v-show

v-if v-else v-else-if 条件性的渲染某元素,判定为true时渲染,否则不渲染 v-show 根据条件展示某元素,区别在于切换的是display属性的值 v-if在浏览器中element标签中如果不满足条件就不会渲染展示…

【Datawhale AI夏令营第四期】 魔搭-大模型应用开发方向笔记 Task01 DeepSeek简易AI助手

【Datawhale AI夏令营第四期】 魔搭-大模型应用开发方向 Task01 正处于拿毕业证求职和实习离职期间的过渡期,想着闲着也是闲着,索性拉上本科同学队友报名参加AI比赛,想方设法卷个项目经验出来。 Task1的任务主要是体验从0开始搭建一个AI对…

【AI】算力底座的巨变

生成式 AI 的迅猛演进,推动 AI 基础设施(AI Infra)加速发展,增长趋势将从大模型专业领域延伸至各行业领域,AI Infra“质量双螺旋”的发展模式将逐步形成,单集群从万卡“量变”至十万卡的同时,集…

电脑文件加密怎么设置?手把手一步一步教给你

电脑文件加密是保护个人隐私和敏感信息的重要手段,可以通过多种方法实现。以下是一些常用的电脑文件加密设置方法,包括使用安企神加密软件的步骤。 一、电脑文件加密的通用方法 1.Windows系统自带加密功能: 选中需要加密的文件或文件夹&…

【日常记录-MySQL】Shell自动登录MySQL并执行SQL脚本

Author:赵志乾 Date:2024-08-09 Declaration:All Right Reserved!!! 1. 简介 在Shell脚本中自动登录MySQL并执行脚本是一个常见的自动化任务,尤其是在数据备份、报表生成或批量数据处理时非常有…

算法训练营第55天|101孤岛的总面积|102沉没孤岛|103水流问题|104.建造最大岛屿

101孤岛的总面积 我的思路:对每一片都求面积,同时递归时判断是否为孤岛。 改进思路:本题要求找到不靠边的陆地面积,那么我们只要从周边找到陆地然后 通过 dfs或者bfs 将周边靠陆地且相邻的陆地都变成海洋,然后再去重…

SPI通信协议

目录 一、SPI简介 二、寻址方式 三、通信过程 四、SPI设备时钟 五、极性和相位 5.1 CPOL0,CPHA0 5.2 CPOL0,CPHA1 5.3 CPOL1,CPHA0 5.4 CPOL1,CPHA1 🌈你好呀!我是 程序猿 🌌 2024感谢你…

怎样才算精通 Excel?

最强AI视频生成:小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频百万播放量https://aitools.jurilu.com/ 高赞回答很系统,但普通人这么学,没等精通先学废了! 4年前,我为了学数据分析&#…