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

news2024/11/27 2:26:38

清空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():安排一个对象在其事件循环的适当时间被删除,通常用于确保在对象不再需要时正确地释放资源,同时避免在删除过程中发生潜在的线程冲突或其他问题。

大致的用法如下:

# 获取布局中控件的数量
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()方法

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

完整的代码如下:

    # 布局清空函数
    def f_clearLayoutFunc(self, layout):
        """
        function:  布局清空函数
              in:  layout:要清空的布局;
             out:  None
          return:  None
          others:  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_layout
                    self.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.coloradmin.cn/o/1985546.html

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

相关文章

Sol盗u、sol链上的USDT盗窃:警惕恶意智能合约

随着区块链技术的普及,Solana链上的应用和用户数量不断增加。然而,这也为不法分子提供了可乘之机,恶意智能合约逐渐成为盗取USDT等加密资产的一种常见手段。本文将详细介绍恶意智能合约的工作原理,并提供防范措施,帮助…

【OpenCV C++20 学习笔记】Canny边缘检测

Canny边缘检测 原理步骤 API实例 原理 Canny边缘检测也称为“最优检测”(optimal detector),它的开发主要有以下3个目标: 低错误率:只检测真实存在的边缘良好的定位:检测出来的边缘与真实的边缘之间的距离要达到最小最小的反馈&…

报错Process exited with an error: 1 (Exit value: 1)

问题描述 运行springboot程序,程序报错 Process exited with an error: 1 (Exit value: 1)打开错误描述,发现是端口8080被占用(我们的端口号未必一致,改成你报错的端口) 问题分析 明确报错内容后,关闭…

SNAT、DNAT 防火墙规则

文章目录 一、SNAT原理与应用案列:1.给服务器和路由器(以liunx替代)做好准备工作(安装iptables和关闭firewalld防火墙)2.如果安装了iptables,设置80端口的访问为允许(liunx1:充当服务器)3.设置ens36网卡的地址为10.0.0.1(liunx2:充当路由器)4.修改liunx1服务器的ip地址和网关5.…

【Android Studio】图标一键生成 Image Asset Studio(一键各机型适配图标生成工具-告别一个一个替换)

文章目录 方法一:原始替换方法二:Image Asset Studio 方法一:原始替换 https://blog.csdn.net/xzzteach/article/details/140821856 方法二:Image Asset Studio 自动替换

易捷OA协同办公系统 ShowPic接口任意文件读取漏洞复现 [附POC]

文章目录 易捷OA协同办公系统 ShowPic接口任意文件读取漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现易捷OA协同办公系统 ShowPic接口任意文件读取漏洞复现 [附POC] 0x01 前言 免责声明:请勿利用文章内的相…

在当今的大环境下,怎么做好一名嵌入式工程师?

不知不觉2024年已经过了一半了,我在csdn也更新了不少文章,也有很多想说的,没有地方发,想来想去,也就发在这里了,反正也没有多少人看 2024年目前大环境大家都应该很清楚,最新消息,英…

登录页滑块验证图

效果图 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head> <b…

Omnissa Horizon 8 2406 (8.13) 发布 - 虚拟桌面基础架构 (VDI) 和应用软件

Omnissa Horizon 8 2406 (8.13) 发布 - 虚拟桌面基础架构 (VDI) 和应用软件 之前称为 VMware Horizon, 通过高效、安全的虚拟桌面交付增强您的工作空间 请访问原文链接&#xff1a;https://sysin.org/blog/omnissa-horizon-8/&#xff0c;查看最新版。原创作品&#xff0c;转…

【弱监督时间动作定位】ACGNet: Action Complement Graph Network for WSTAL 论文阅读

ACGNet: Action Complement Graph Network for Weakly-supervised Temporal Action Localization 论文阅读 AbstractIntroductionRelated WorkAction Complement Graph NetworkMethod OverviewAction Complement GraphGraph InferenceTraining Objective ExperimentsConclusion…

广告牌安全隐忧多?撞击震动预警终端,守护城市安全网

据央视新闻最新报道&#xff0c;7月22日晚21时左右&#xff0c;云南省昆明市盘龙区金江路一临街商铺的五楼顶部广告牌突发脱落事故&#xff0c;该意外事件已导致五人受伤&#xff0c;再次为公众安全敲响了警钟。这一事件深刻凸显了加强对城市中各类广告牌及其他悬挂设施安全状态…

夜神模拟器抓取app包

夜神模拟器抓取app包 使用到的工具有 夜神模拟器 kali burp 具体步骤&#xff1a; 1&#xff0c;模拟器设置代理&#xff0c;下载bp的证书 2&#xff0c;利用kali openssl将证书转为可信任证书 3&#xff0c;模拟器开启开发者模式 4&#xff0c;在夜神模拟器终端运行命令安装证…

C# 集合操作的艺术:深入解析数据分区策略与高效筛选技巧(Skip、SkipWhile、Take、TakeWhile)

文章目录 概述Skip 和 SkipWhile 方法Take 和 TakeWhile 方法综合应用示例总结 在C#中&#xff0c;LINQ&#xff08;语言集成查询&#xff09;提供了一种非常方便的方式来处理数据集合。本文将详细介绍四种数据分区方法&#xff1a;Skip、SkipWhile、Take、TakeWhile&#xff0…

2024固态选购指南,可以买贵的但不能买贵了

前两天谈到三星后院“起火”&#xff0c;也就是大规模半导体工人罢工&#xff0c;有一部分同学就焦虑起来了。 怕内存和固态近期涨价&#xff0c;纷纷发私信询问配置问题&#xff0c;阿红也大致看了下&#xff0c;大件搭配方面大家都没啥问题了&#xff0c;但唯独在众多固态硬…

萤石网络获评“2024最具价值科创板上市公司”

近日&#xff0c;在科创板开市五周年峰会上&#xff0c;由权威媒体《科创板日报》与财联社联合发起的“科创板开市五周年评选”榜单正式揭晓&#xff0c;萤石网络成功入选“2024最具价值科创板上市公司”榜单。 “2024最具价值科创板上市公司”榜单通过对500余家上市公司业务创…

python: 多进程实例

1. 实例一 主进程跟子进程的通过两个队列实现全双工通信&#xff1b;如有需要主进程会提示窗口输入信息传输给子进程&#xff1b;如果子进程收到主进程的消息&#xff0c;会弹窗提示收到的消息&#xff1b;子进程弹窗提示进程即将结束&#xff1b; 详细代码如下 # -*- coding…

电脑监控软件超全盘点!效率与隐私完美平衡!五款软件轻松实现企业级电脑屏幕管控!

企业对电脑监控软件的需求日益增长&#xff0c;旨在提升工作效率、保障数据安全并维护良好的工作环境。但&#xff0c;如何在提升管理效率的同时&#xff0c;尊重并保护员工的个人隐私&#xff0c;成为了企业选择监控软件时必须慎重考虑的问题。本文将为您盘点五款能够完美平衡…

从报名到领证:软考初级【网络管理员】报名考试全攻略

本文共计13189字&#xff0c;预计阅读30分钟。包括七个篇章&#xff1a;报名、准考证打印、备考、考试、成绩查询、证书领取及常见问题。 一、报名篇 报名条件要求&#xff1a; 1.凡遵守中华人民共和国宪法和各项法律&#xff0c;恪守职业道德&#xff0c;具有一定计算机技术…

电子时钟_仅需要浏览器

不需要任何安装框架&#xff0c;代码量少&#xff0c;只需要浏览器就可以。不用上网。 结果&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevi…

2024年武汉职称申报你不知道的那些事儿

2024年武汉职称申报你不知道的那些事儿 2024年武汉建筑类中级职称下半年好机会&#xff0c;手慢无&#xff01; 2024年武汉市下半年工程系列工程师职称中级职称申报评审 湖北省建筑类中级职称申报评审&#xff0c;湖北省各个地级市都是可以申报的&#xff0c;武汉市常规申报1次…