查找指定节点所对应的根节点:
def getTreeWidgetRootItem(self, Item = None):
"""
根据给定节点 Item 递归查找对应的根节点索引号
如果 Item 为空,则获取当前选中节点索引号,并上推根节点的索引号
:param index:
:return:
"""
if Item == None:
currentItem = self.treeWidget.currentItem()
parentItem = currentItem.parent()
else:
currentItem = Item
parentItem = currentItem.parent()
# 如果不是ROOT节点,则继续
if parentItem != None:
rootItem = self.getTreeWidgetRootItem(parentItem)
else:
rootItem = currentItem
return rootItem
遍历指定根节点下的所有子节点
def seekTreeChild(self, treeItem):
"""
递归搜索包括指定 item 及以下的所有项的信息,放入字典中返回
:param treeItem:
:return:
"""
data = {}
# 检查是否已经标注了属性标签,如果已经标注则保存
# 如果有更多列的数据需要取得,做相应的处理
attr = treeItem.text(1)
if attr != "":
data.setdefault("attr")
data["attr"] = eval(attr)
# 查看子项的个数,如果有子项,则读取子项
childCount = treeItem.childCount()
if childCount > 0:
# 标记本项下面有子项
data.setdefault("child")
childData = {}
for i in range(childCount):
# 取得子项的索引地址,并把子项记录在字典里
childItem = treeItem.child(i)
key = childItem.text(0)
childData.setdefault(key)
# 递归搜索更下层的子项
result = self.seekTreeChild(childItem)
childData[key] = result
data["child"] = childData
return data
遍历所有根节点及子节点
def treeWidget2Json(self):
"""
把 treeWidget 中的数据转换为 Json 格式的数据,
本函数处理 Root 项,并调用子项的递归搜索函数
:return:
"""
data = {}
# 获取最顶级节点的总数
rootCount = self.treeWidget.topLevelItemCount()
for i in range(rootCount):
# 取得顶层项的item索引地址
rootItem = self.treeWidget.topLevelItem(i)
rootKey = rootItem.text(0)
data.setdefault(rootKey)
result = self.seekTreeChild(rootItem)
data[rootKey] = result
return data
根据传入的根节点名称,增加根节点
def addRootItem(self, text):
"""
增加一个根节点 text
:param text: 要增加的根节点名称
:return:
"""
# 在treeWidget增加Root项
rootItem = QtWidgets.QTreeWidgetItem(self.treeWidget)
rootItem.setText(0, text)
根据传入的节点 Item 和节点名称,增加子节点
def addChildItem(self, item, text):
"""
在指定节点下面增加一个子节点
:param Item:
:param text:
:return:
"""
# 把子项添加到treeWidget中
childItem = QtWidgets.QTreeWidgetItem(item)
childItem.setText(0, text)
删除指定节点下面的所有子节点
def delChildItem(self, item):
"""
删除指定节点 item 下面的所有子节点
:param item:
:return:
"""
childCount = item.childCount()
for i in range(childCount):
# 取得当前选中项的子项索引地址
childItem = item.child(0)
item.removeChild(childItem)
删除指定节点
def delItem(self, item):
"""
删除指定节点 item,如果指定节点不是根节点,则通过上层节点进行删除
如果 item 是根节点,则取得索引号,通过索引号进行删除
:param item:
:return:
"""
if item.parent() != None:
item.parent().removeChild(item)
else:
rootIndex = self.treeWidget.indexOfTopLevelItem(item)
self.treeWidget.takeTopLevelItem(rootIndex)