从文件路径列表填充QTreeView

2024-09-29 23:25:42 发布

您现在位置:Python中文网/ 问答频道 /正文

这个问题以前在:

https://stackoverflow.com/questions/26538667/pyqt-populate-qtreeview-from-txt-file-that-contains-file-paths

但似乎没有得到回应。在

我有一个格式化的文件路径数据集,如下所示:

hon_dev/Bob Dylan/Concept
hon_dev/Andromeda/Modeling
hon_dev/Andromeda/Lookdev
hon_dev/Andromeda/Rigging
hon_dev/Andromeda/Animation
hon_dev/Andromeda/FX
hon_dev/fsafasfas/production
hon_dev/Magebane: Acheron of Mana Aeacus/Model
hon_dev/Magebane: Acheron of Mana Aeacus/Concept
hon_dev/Magebane: Acheron of Mana Aeacus/Texture
hon_dev/Skrull/Modeling
hon_dev/Skrull/Lookdev
hon_dev/Skrull/Rigging
hon_dev/Skrull/Animation
hon_dev/Skrull/FX
hon_dev/Bob Mylan/Modeling
hon_dev/Bob Mylan/Lookdev
hon_dev/Bob Mylan/Rigging
hon_dev/Bob Mylan/Animation
hon_dev/Bob Mylan/FX
hon_dev/Handsome Man/Concept
hon_dev/Handsome Man/Modeling
hon_dev/Handsome Man/Lookdev
hon_dev/Handsome Man/Rigging
hon_dev/Handsome Man/Animation
hon_dev/Handsome Man/FX
demo-sync/Drone Craft/Modelling Drone Craft
demo-sync/Drone Craft/Texturing and Shading of Drone Craft
demo-sync/Drone Craft/Rigging Drone Parts

我正试着让他们填满一个QTreeView(PySide)。我现在的代码就是这样,有一个简单的递归函数:

^{pr2}$

但是,由于我找不到任何方法来查看QStandardItem中现有的行,因此我在UI中得到了以下结果:

enter image description here

有没有方法可以在QStandardItem中找到重复的行,或者遍历QStandardItemModel来查找现有的QStandardItem?在过去的两天里,我一直在努力解决这个问题,并试图找到一个现有的例子,我真的不知道为什么这会是一个如此复杂的问题。。。在

如有任何帮助/建议,将不胜感激!谢谢!在


Tags: devbobfxmodelinganimationdronecraftman
1条回答
网友
1楼 · 发布于 2024-09-29 23:25:42

嗯,经过一番吹毛求疵之后,我想出了一个暂时可行的方法,不过文件路径必须是这样才能工作的:

def doIt(self):

    print "\n\n\n\n"

    self.model = QtGui.QStandardItemModel()

    topLevelParentItem = self.model.invisibleRootItem()

    # iterate over each string url
    for item in data:
        splitName = item.split('/')

        # first part of string is defo parent item
        # check to make sure not to add duplicate
        if len(self.model.findItems(splitName[0], flags=QtCore.Qt.MatchFixedString)) == 0:

            parItem = QtGui.QStandardItem(splitName[0])
            topLevelParentItem.appendRow(parItem)


        def addItems(parent, elements):
            """
            This method recursively adds items to a QStandardItemModel from a list of paths.
            :param parent:
            :param elements:
            :return:
            """

            for element in elements:

                # first check if this element already exists in the hierarchy
                noOfChildren = parent.rowCount()

                # if there are child objects under specified parent
                if noOfChildren != 0:
                    # create dict to store all child objects under parent for testing against
                    childObjsList = {}

                    # iterate over indexes and get names of all child objects
                    for c in range(noOfChildren):
                        childObj = parent.child(c)
                        childObjsList[childObj.text()] = childObj

                    if element in childObjsList.keys():
                        # only run recursive function if there are still elements to work on
                        if elements[1:]:
                            addItems(childObjsList[element], elements[1:])

                        return

                    else:
                        # item does not exist yet, create it and parent
                        newObj = QtGui.QStandardItem(element)
                        parent.appendRow(newObj)

                        # only run recursive function if there are still elements to work on
                        if elements[1:]:
                            addItems(newObj, elements[1:])

                        return

                else:
                    # if there are no existing child objects, it's safe to create the item and parent it
                    newObj = QtGui.QStandardItem(element)
                    parent.appendRow(newObj)

                    # only run recursive function if there are still elements to work on
                    if elements[1:]:
                        # now run the recursive function again with the latest object as the parent and
                        # the rest of the elements as children
                        addItems(newObj, elements[1:])

                    return

        # call proc to add remaining items after toplevel item to the hierarchy
        print "### calling addItems({0}, {1})".format(parItem.text(), splitName[1:])
        addItems(parItem, splitName[1:])

        print 'done: ' + item + '\n'

    self.inst.col_taskList.setModel(self.model)

相关问题 更多 >

    热门问题