Создание иерархии QTreeView из заданного списка - PullRequest
0 голосов
/ 08 сентября 2018

Учитывая список строк, я пытаюсь заполнить элементы в виде дерева.Вот мой код:

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 голосов
/ 08 сентября 2018

Вы должны добавить дочерние элементы, если они не являются частью дочерних элементов, также вы должны удалить первый элемент результата 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

...