如何将具有许多子目录的目录从路径列表附加到 QTree?

问题描述 投票:0回答:1

我正在使用的功能可以工作,但不是我想要的那样。对于路径列表中的每个新条目,如果路径相似,它会在树中添加一个新行,而不是将其附加到前一个条目。我希望添加的图像和数据列表能够澄清我的问题。我该怎么做才能使条目将后续目录附加到树视图中的现有行,而不是每次在树视图中创建新行?

我的输入数据和生成的树视图看起来不太好。我希望后续条目能够扩展树中的相应行,而不是每次都创建新行,如附图中所示。

来自服务器的路径列表:

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 中的样子:

enter image description here

enter image description here

python pyqt6 qtreeview qtreewidget qtreewidgetitem
1个回答
0
投票

在处理树结构时,您几乎总是需要某种程度的递归才能有效地“浏览”(或创建)其内容。

路径列表的一个可能的解决方案是创建一个字典,使用每个项目(包括“文件夹”)的完整路径作为键,并使用相关的 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])
© www.soinside.com 2019 - 2024. All rights reserved.