从给定列表创建QTreeView层次结构

时间:2018-09-08 00:17:01

标签: python pyqt pyqt4 qtreeview

给出一个字符串列表,我试图在树状视图中填充项目。 这是我的代码:

class MyModel(QtGui.QStandardItemModel):
    def __init__(self, parent=None):
        super(MyModel, self).__init__(parent)
        self.get_contents()

    def get_contents(self):
        self.clear()
        contents = [
            '|Base|character|Mike|body',
            '|Base|character|John',
            '|Base|camera'
        ]

        for content in contents:
            count = content.count('|')
            for index in range(count):
                index = index + 2
                split_path = content.split('|')[0:index]
                self.add_item(split_path)

    def add_item(self,name):
        item1 = QtGui.QStandardItem(name)
        self.appendRow([item1])

但是,我在树形视图中获得的层次结构是不可折叠的(在侧面带有小箭头图标的那些层次结构),并且每行都附加了值并且可编辑(如果双击),我不希望这样做

我的代码输出的示例:

|Base
|Base|character
|Base|character|Mike
|Base|character|Mike|body
|Base
|Base|character
|Base|character|John
|Base
|Base|camera

其中有一些可重复的行...

这就是我所期望的:

|-- Base
|--|-- character
|--|--|-- Mike
|--|--|--|-- body
|--|-- character
|--|--|-- John
|--|-- camera

有什么见解吗?

1 个答案:

答案 0 :(得分:1)

如果这不是子项的一部分,则必须添加子项,并且您必须删除split()结果的第一个元素,因为它是一个空元素:

from PyQt4 import QtCore, QtGui


class MyModel(QtGui.QStandardItemModel):
    def __init__(self, parent=None):
        super(MyModel, self).__init__(parent)
        self.get_contents()

    def get_contents(self):
        self.clear()
        contents = [
            '|Base|character|Mike|body',
            '|Base|character|John',
            '|Base|camera'
        ]

        for content in contents:
            parent = self.invisibleRootItem()
            for word in content.split("|")[1:]:
                for i in range(parent.rowCount()):
                    item = parent.child(i) 
                    if item.text() == word:
                        it = item
                        break
                else:
                    it = QtGui.QStandardItem(word)
                    parent.setChild(parent.rowCount(), it)
                parent = it


if __name__ == '__main__':
    import sys

    app = QtGui.QApplication(sys.argv)

    w = QtGui.QTreeView()
    model = MyModel(w)
    w.setModel(model)
    w.show()
    w.expandAll()
    sys.exit(app.exec_())

enter image description here