我正在使用的功能可以工作,但不是我想要的那样。对于路径列表中的每个新条目,如果路径相似,它会在树中添加一个新行,而不是将其附加到前一个条目。我希望添加的图像和数据列表能够澄清我的问题。我该怎么做才能使条目将后续目录附加到树视图中的现有行,而不是每次在树视图中创建新行?
我的输入数据和生成的树视图看起来不太好。我希望后续条目能够扩展树中的相应行,而不是每次都创建新行,如附图中所示。
来自服务器的路径列表:
data = ['Default', 'GRAFIKA', 'GRAFIKA/PROGRAMY', 'GRAFIKA/PROGRAMY/POLONIA24_2020', 'GRAFIKA/PROGRAMY/POLONIA24_2020/ASSET', 'GRAFIKA/PROGRAMY/POLONIA24_2020/ASSET/IMG', 'GRAFIKA/PROGRAMY/POLONIA24_2020/ASSET/LIVE', 'GRAFIKA/PROGRAMY/POLONIA24_2020/ASSET/LOGO', 'GRAFIKA/PROGRAMY/POLONIA24_2020/ASSET/PLACE', 'GRAFIKA/PROGRAMY/POLONIA24_2020/ASSET/STILL_BELKA', 'GRAFIKA/PROGRAMY/POLONIA24_2020/ASSET/TYLOWKA', 'GRAFIKA/PROGRAMY/POLONIA24_2020/FONT', 'GRAFIKA/PROGRAMY/POLONIA24_2020/PREV', 'GRAFIKA/PROGRAMY/POLONIA24_2020/SCENE', 'GRAFIKA/PROGRAMY/POLONIA24_2020/SCENE/BACKUP', 'GRAFIKA/PROGRAMY/polonia_backup', 'GRAFIKA/PROGRAMY/polonia_backup/POLONIA24_2020', 'GRAFIKA/PROGRAMY/polonia_backup/POLONIA24_2020/ASSET', 'GRAFIKA/PROGRAMY/polonia_backup/POLONIA24_2020/ASSET/IMG', 'GRAFIKA/PROGRAMY/polonia_backup/POLONIA24_2020/ASSET/LIVE', 'GRAFIKA/PROGRAMY/polonia_backup/POLONIA24_2020/ASSET/LOGO', 'GRAFIKA/PROGRAMY/polonia_backup/POLONIA24_2020/ASSET/PLACE', 'GRAFIKA/PROGRAMY/polonia_backup/POLONIA24_2020/ASSET/STILL_BELKA', 'GRAFIKA/PROGRAMY/polonia_backup/POLONIA24_2020/ASSET/TYLOWKA', 'GRAFIKA/PROGRAMY/polonia_backup/POLONIA24_2020/FONT', 'GRAFIKA/PROGRAMY/polonia_backup/POLONIA24_2020/PREV', 'GRAFIKA/PROGRAMY/polonia_backup/POLONIA24_2020/SCENE', 'PROGRAMY', 'PROGRAMY/VOICE_2022', 'PROGRAMY/VOICE_2022/SLUPKI', 'PROGRAMY/VOICE_2022/SLUPKI/CZESCI_GRAFIKI', 'PROGRAMY/VOICE_21', 'VOICE', 'VOICE/SLUPKI', 'VOICE/SLUPKI/WYNIKI_PARY']
我的代码:
class FunctionsWindow(QWidget, Ui_Function):
def __init__(self, parent=None):
super().__init__()
self.setupUi_Function(self)
self.show()
self.pushButton_Scan.clicked.connect(self.makeTree)
self.model = QStandardItemModel()
self.tree_view = QTreeView()
self.tree_view.setModel(self.model)
def makeTree(self):
data = VizTree(Server.IPSerwer)
treeWidget = self.treeWidget
items = []
for item in data:
itemparts = item.split('/')
entry = QTreeWidgetItem(None, [itemparts[0]])
partentitem = entry
if len(itemparts) > 1:
for i in itemparts[1:]:
childitem = QTreeWidgetItem(None, [i])
partentitem.addChild(childitem)
partentitem = childitem
items.append(entry)
treeWidget.insertTopLevelItems(0, items)
这就是我的树在 PYQT6 中的样子:
在处理树结构时,您几乎总是需要某种程度的递归才能有效地“浏览”(或创建)其内容。
路径列表的一个可能的解决方案是创建一个字典,使用每个项目(包括“文件夹”)的完整路径作为键,并使用相关的 QTreeWidgetItem 作为值。
items = {}
def makeChild(parentPath, name):
if parentPath:
itemPath = parentPath + '/' + name
else:
itemPath = name
if parentPath in items:
parent = items[parentPath]
else:
if not parentPath:
parent = items[''] = treeWidget
else:
splitPath = parentPath.split('/')
parent = makeChild('/'.join(splitPath[:-1]), splitPath[-1])
item = items[itemPath] = QTreeWidgetItem(parent, [name])
return item
for item in data:
splitPath = item.split('/')
makeChild('/'.join(splitPath[:-1]), splitPath[-1])