在项目中有下面这样的结构,需要动态的加载
所以有彻底删除这部分组件的需求,操作如下:
def _clear_all_fee_widgets(self):
"""
清空当前页面内的全部组件
"""
for i in reversed(range(len(self.fee_group))):
for j in reversed(range(self.fee_group[i].count())):
item = self.fee_group[i].takeAt(j) # takeAt: 移除布局中的组件
widget = item.widget()
if widget:
widget.deleteLater()
self.fee_group[i] = None
self.fee_group = []
其中takeAt、reversed没接触过,所以查了一下用法:
takeAt
takeAt
是 QLayout
类中的一个方法,用于从布局中移除并返回指定索引处的项(QLayoutItem
)。这个方法通常用于在迭代过程中动态地修改布局,比如移除布局中的某些组件。
当你调用 takeAt(index)
时:
index
是你想要移除的项的索引。索引通常从 0 开始,到布局中项的总数减一。- 该方法会移除指定索引处的项,并返回该项的
QLayoutItem
对象。这个QLayoutItem
对象通常封装了一个控件(如QWidget
)或者另一个布局。 - 如果移除成功,该项将不再属于该布局,但返回的
QLayoutItem
对象仍然有效,直到你决定删除它或它自己被删除。
重要的是要注意,takeAt
只是从布局中移除了项,但并没有删除该项封装的控件。如果你想要删除控件并释放其占用的内存,你需要调用 deleteLater()
方法(对于 QWidget
及其子类)来在事件循环的下一个迭代中安排删除。
reversed
reversed()
是 Python 的一个内置函数,它接受一个序列(比如列表、元组、字符串或者任何实现了 __reversed__
方法的对象),并返回一个反向迭代器,用于在循环中反向遍历该序列的元素。使用 reversed()
可以很方便地以相反的顺序访问序列中的元素,而不需要手动地计算索引或者对序列进行切片。
在处理布局中的项时,我们可能需要从后向前迭代以避免因为删除操作而引发的索引问题。如果我们只是简单地从前往后迭代并删除元素,那么在删除一个元素后,所有后续元素的索引都会发生变化。而如果我们从后向前删除,那么删除操作就不会影响尚未处理的元素的索引。