pyqt5——窗体中控件的添加与删除

pyqt5实现桌面便签及提醒

 

 

 

添加widget的方法:

使用grid中的addwidget()添加展示控件

 

 

删除widget的方法:(涉及内存管理,不甚明了)

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为标志进行增删、访问

 

 

demo:

点击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_())

 

你可能感兴趣的:(pyqt,pyqt,控件)