一个折磨了我好久好久的问题,终于得到解决,哈哈哈!百度了很久,都没有找到具体方法,最后突然试出来了
首先,在不知道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为节点
{'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(),那么就会出现点击节点时,表格的数据进行了切换,但是界面却没有进行更新的情况