使用grid中的addwidget()添加展示控件
1)使用layout中Item.widget().deleteLater(),获取布局中的item对应的widget,延迟删除widget本身,
可以实现在窗口中移除widget,但grid 的rowcount不变、count不变,grid中的widget仍然可以访问,但不能再次删除
2)使用layout中的removeWidget + sip.delete(Widget),也可以实现删除控件,删除更彻底
可以实现在窗口中移除widget,grid 的rowcount不变、count发生变化,grid中的widget不可以访问
***grid中有update方法,网上参考资料较少,推测为布局更新,但是对上述情况无作用
综上,使用removeWidget + sip.delete(Widget)的方法,以count为标志进行增删、访问
点击add,增加一行标签;点击remove,移除所有标签
# -*- coding: utf-8 -*-
# @Time : 2020/4/17 20:36
# @Author : Zhao HL
# @File : 13_widgetRemoveAdd.py
import sys
from PyQt5.QtWidgets import *
import sip
class Example(QMainWindow):
def __init__(self):
super(Example,self).__init__()
self.init_UI()
def init_UI(self):
self.setWindowTitle('test')
self.li = []
self.grid = QGridLayout()
self.grid.setSpacing(10)
self.widget = QWidget()
self.widget.setLayout(self.grid)
self.setCentralWidget(self.widget)
print('before hbox:',self.grid.rowCount())
add_btn = QPushButton('add')
add_btn.clicked.connect(self.add)
remove_btn = QPushButton('remove')
remove_btn.clicked.connect(self.remove)
hbox = QHBoxLayout()
hbox.addWidget(add_btn)
hbox.addWidget(remove_btn)
self.grid.addLayout(hbox,1,0)
print('after hbox:', self.grid.rowCount())
self.li.append(QLabel('lb2'))
self.grid.addWidget(self.li[0],2,0)
self.show()
def add(self):
add_pos = self.grid.count()+1
add_num = len(self.li)
self.li.append(QLabel('lb'+str(add_pos)))
self.grid.addWidget(self.li[add_num], add_pos, 0)
def remove(self):
for i in range(self.grid.count()+1,2,-1):
print(self.grid.rowCount(),len(self.grid),self.grid.count())
wd = self.grid.itemAtPosition(i - 1, 0).widget()
# method 1
# wd.deleteLater()
# method 2
self.grid.removeWidget(wd)
sip.delete(wd)
# 尝试继续访问
for i in range(self.grid.count(), 2, -1):
print(i,self.grid.itemAtPosition(i - 1, 0).widget().size())
if __name__ == '__main__':
app = QApplication(sys.argv)
example = Example()
sys.exit(app.exec_())