【问题标题】:Populating QTreeView from list of file paths从文件路径列表中填充 QTreeView
【发布时间】:2015-05-13 21:24:25
【问题描述】:

这个问题之前在:

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)。我目前的代码就是这样,带有一个简单的递归函数:

def doIt(self):

    self.model = QtGui.QStandardItemModel()

    # self.model.setHorizontalHeaderLabels = ['test']

    topLevelParentItem = self.model.invisibleRootItem()

    # create all itewms first



    # 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):

            # check if not reached last item in the list of items to add
            if len(elements) != 0:

                print "currently eval addItems({0}, {1}".format(parent.text(), elements)

                # check if item already exists, if so do not create 
                # new item and use existing item as parent
                if len(self.model.findItems(elements[0], flags=QtCore.Qt.MatchFixedString)) == 0:

                    print "item being created for {0}".format(elements[0])
                    item = QtGui.QStandardItem(elements[0])

                else:
                    print "not adding duplicate of: {0}".format(elements[0])
                    item = self.model.findItems(elements[0], flags=QtCore.Qt.MatchFixedString)[0]
                    print "the item to act as non-duplicate is: {0}".format(item.text())

                child = elements[1:]
                print "child is {0}".format(child)

                # call recursive function to add
                addItems(item, child)

                print "parenting: {0} to {1}".format(item.text(), parent.text())
                parent.appendRow(item)

        addItems(parItem, splitName[1:])



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



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

但是,因为我找不到任何方法来查看现有行的 QStandardItem,所以我在 UI 中得到了这个结果:

有没有办法在 QStandardItem 中查找重复行或遍历 QStandardItemModel 以找到现有的 QStandardItem?在过去的 2 天里,我一直在努力解决这个问题,并试图找到一个现有的例子,但我真的无法理解这怎么会如此复杂......

对此的任何帮助/建议将不胜感激!谢谢!

【问题讨论】:

    标签: python pyqt qtreeview qstandarditemmodel qstandarditem


    【解决方案1】:

    嗯,经过一番折腾,我想出了一些现在可以使用的东西,尽管文件路径必须是为了使它起作用:

    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)
    

    【讨论】:

      猜你喜欢
      • 2011-09-18
      • 1970-01-01
      • 2010-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多