QT:pyqt删除layout中的控件,移除、添加、替换控件

一个折磨了我好久好久的问题,终于得到解决,哈哈哈!百度了很久,都没有找到具体方法,最后突然试出来了

首先,在不知道layout中控件的情况下,要删除所有的子控件,可采用以下方法:

for i in range(verticalLayout_3.count()):
    print(verticalLayout_3.count())
    verticalLayout_3.itemAt(i).widget().deleteLater()
或者
for i in range(verticalLayout_3.count()): 
    verticalLayout_3.itemAt(i).widget().delete()

delete()使用实时就删除了控件

deleteLater()并没有将对象立即销毁,而是向主消息循环发送了一个event,下一次主消息循环收到这个event之后才会销毁对象。 这样做的好处是可以在这些延迟删除的时间内完成一些操作,坏处就是内存释放会不及时


但是由于我的需求不一样,所以不能采用这种方法

我需要实现的目标:当我点击节点时,能切换节点所对应的不同的表格

 先说说我的思路:(我采用的是Python+pyqt+Pycharm)

1.在创建一个节点的同时,新建一个表格(tablewidget)

2.把节点和新建的表格,变成一个字典返回,则可以通过节点为索引,查找到对应节点所对应的表格

3.判断当前表格和当前节点所对应的表格是否一致

4.如果不一致,则移除当前表格,添加当前节点所对应的表格

首先,创建一个新建表格的函数(我这里是根据自己当前环境建立的,只有部分函数,不能直接运行)

def addtablewidget(verticalLayoutWidget_3):
    stepdebugtableWidget = QtWidgets.QTableWidget()
    stepdebugtableWidget.setGridStyle(QtCore.Qt.NoPen)
    stepdebugtableWidget.setRowCount(1)
    stepdebugtableWidget.setColumnCount(25)
    stepdebugtableWidget.setObjectName("stepdebugtableWidget")
    stepdebugtableWidget.verticalHeader().setVisible(False)
    stepdebugtableWidget.setHorizontalHeaderLabels(
        ['ID', 'PR', 'Stepname', 'command', 'settings', 'StationExe',
         'run', 'disable', 'show', 'delay', 'readEndflag', 'Enter', 'InterceptBegain',
         'InterceptEnd', 'PDCA', 'Typle', 'exctime', 'soc', 'singal', 'NextStep',
         'FailStep', 'Repetition', 'TWodir', 'Onedir'])
    #verticalLayout_3.addWidget(stepdebugtableWidget)
    return stepdebugtableWidget

addtablewidget(verticalLayoutWidget_3)是一个新建表格的函数,返回一个表格

def stationname(treeWidget,verticalLayoutWidget_3,verticalLayout_3):
    item_list = []
   #简单的通过一个循环创建节点
    for i in range (3):
        root = QTreeWidgetItem(treeWidget)
        #当我新建一个节点时,同时新建一个表格
        root.setText(0,str(i))    
        stepdebugtableWidget = addtablewidget(verticalLayoutWidget_3)
        try:
            item = (str(i), stepdebugtableWidget)
            item_list.append(item)
            dict2 = dict(item_list)
        except:
            pass
    return dict2
stationname(treeWidget,verticalLayoutWidget_3,verticalLayout_3)函数返回一个节点和节点对应表格,所组成的字典

如下所示:

0,1,2为节点

为    addtablewidget(verticalLayoutWidget_3)函数返回的表格

{'0': ,

'1': ,

'2': }

 

def root(treeWidget,verticalLayoutWidget_3, verticalLayout_3):
    stepdebugtableWidget=stationname(treeWidget, verticalLayoutWidget_3, verticalLayout_3)
    treeWidget.clicked.connect(lambda :onClicked1(treeWidget,verticalLayout_3,stepdebugtableWidget,verticalLayoutWidget_3))

root:

1.得到一个字典,节点和表格一一对应的字典

stepdebugtableWidget=stationname(treeWidget, verticalLayoutWidget_3, verticalLayout_3)

2.节点的连接函数,点击一下节点,运行这个函数

treeWidget.clicked.connect(lambda : onClicked1(treeWidget,verticalLayout_3,stepdebugtableWidget,verticalLayoutWidget_3))

节点的连接函数

def onClicked1(treeWidget1,verticalLayout_3,stepdebugtableWidget,verticalLayoutWidget_3):

        item = treeWidget1.currentItem().text(0)
        data1 = stepdebugtableWidget[item]
        for i in range(verticalLayout_3.count()):
            if verticalLayout_3.itemAt(i).widget() !=data1:
                verticalLayout_3.itemAt(i).widget().close()
                verticalLayout_3.removeWidget(verticalLayout_3.itemAt(i).widget())
                verticalLayout_3.addWidget(data1)
        data1.show()
        print(item,data1)
        return item

得到当前节点      item = treeWidget1.currentItem().text(0)

 得到当前节点所对应的表格。  data1 = stepdebugtableWidget[item]

verticalLayout_3.count() 为  verticalLayout_3 这个布局内控件的个数

verticalLayout_3.itemAt(i).widget()  为   verticalLayout_3 这个布局当前的控件

1.得到当前布局控件的个数

2.得到当前布局中的控件

3.关闭控件

4.remove控件

5.添加控件

6.显示控件

for i in range(verticalLayout_3.count()):
    if verticalLayout_3.itemAt(i).widget() !=data1:
        verticalLayout_3.itemAt(i).widget().close()
        verticalLayout_3.removeWidget(verticalLayout_3.itemAt(i).widget())
        verticalLayout_3.addWidget(data1)
data1.show()

这里着重注意close()和show()两个函数,如果只采用removeWidget(),那么就会出现点击节点时,表格的数据进行了切换,但是界面却没有进行更新的情况

 

 

你可能感兴趣的:(QT:pyqt删除layout中的控件,移除、添加、替换控件)