QTreeWidget折叠子项(折叠当前项的所有子项)

一、仅折叠子项

首先 Qt 已经提供了QTreeWidgetItem.setExpanded(expand)函数,当expand为true,则展开该项,否则折叠该项;搭配上QTreeWidgetItem.isExpanded()函数使用,即可完成折叠子项。

# 获取到当前项
item = self.ui.treeWidget.currentItem()
# 根据当前项状态,来设置展开或折叠
item.setExpanded(not item.isExpanded())

二、折叠当前项的所有子项

不过,配合QTreeWidgetItemIterator以及参数HasChildren,便可实现折叠当前项的所有子项。

# 获取起始节点
item = self.ui.treeWidget.currentItem()
# 存储当前项的状态
enable = item.isExpanded()
# 从item开始迭代 配合参数HasChildren 仅迭代有子节点的节点
it = QTreeWidgetItemIterator(item, QTreeWidgetItemIterator.HasChildren)
while it.value() != None:
	it.value().setExpanded(enable)
	it=it.__iadd__(1)
	# 是否是根节点 当前节点是否为空
	if item.parent() != None and it.value() != None:
		# 如果当前节点的父节点和起始节点父节点一致时 则退出循环
		if item.parent() == it.value().parent():
			break

三、递归折叠当前项的所有子项

该方法未成功实现递归折叠当前项的所有子项功能!

def treeWidget_itemExpanded_AllChildren(item,enable,flag_item):
	# 当前项有子项时 扫描它的子项是否还有 子子项
	if item.childCount() > 0:
		for i in range(0, item.childCount()):
			item_c = item.child(i)
			# 如果有子子项 and 当前子项没折叠 就递归扫描
			if item.childCount() > 0 and item_c.isExpanded():
				item = item_c
			# 如果子项没有 子子项了
			else:
				item.setExpanded(enable)
				if item.parent() == flag_item.parent():
					return ;

	else:
		item = item.parent()
	treeWidget_itemExpanded_AllChildren(item, enable, flag_item)

07-22 10:42