Поведение QTreeView при вставке столбца с индексом 0 - PullRequest
1 голос
/ 27 марта 2020

Я пытаюсь понять странное (на мой взгляд) поведение при попытке вставить столбец в древовидную структуру с индексом 0.

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

Если я добавлю дочерний элемент к элементу, который не находится в первом столбце, он явно не отображается, поскольку раскрываются только дочерние элементы индекса root в первом столбце; но похоже, что при вставке нового столбца существующие дочерние элементы предыдущего первого столбца «наследуются» новым элементом.

class TreeTest(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        layout = QtWidgets.QVBoxLayout(self)

        insertColBtn = QtWidgets.QPushButton('insert column')
        layout.addWidget(insertColBtn)
        insertColBtn.clicked.connect(self.insertColumn)

        insertColAfterBtn = QtWidgets.QPushButton('insert child and insert column')
        layout.addWidget(insertColAfterBtn)
        insertColAfterBtn.clicked.connect(self.insertColumnAfter)

        removeColBtn = QtWidgets.QPushButton('remove column')
        layout.addWidget(removeColBtn)
        removeColBtn.clicked.connect(self.removeColumn)

        self.tree = QtWidgets.QTreeView()
        layout.addWidget(self.tree)
        self.model = QtGui.QStandardItemModel()
        self.tree.setModel(self.model)
        self.parent1 = QtGui.QStandardItem('parent 1')
        self.parent2 = QtGui.QStandardItem('parent 2')
        self.model.appendRow([self.parent1, self.parent2])
        self.child = QtGui.QStandardItem('child of parent 1')
        self.parent1.appendRow(self.child)
        self.parent2.appendRow(QtGui.QStandardItem('child of parent 2'))
        self.tree.expandAll()
        self.tree.header().setSectionResizeMode(QtWidgets.QHeaderView.ResizeToContents)

    def insertColumn(self):
        newParent = QtGui.QStandardItem('new parent')
        self.model.insertColumn(0, [newParent])
        newChild = QtGui.QStandardItem('new column child')
        self.parent1.appendRow(newChild)

    def insertColumnAfter(self):
        newParent = QtGui.QStandardItem('new parent')
        newChild = QtGui.QStandardItem('new column child')
        self.parent1.appendRow(newChild)
        self.model.insertColumn(0, [newParent])

    def removeColumn(self):
        self.model.removeColumn(0)

Это то, что появляется в начале («дочерний элемент родитель 2 "явно скрыт):

first shown, child item of the first column is visible, child of second is not

Затем я вставляю новый первый столбец, затем Я добавляю дочерний элемент к предыдущий родитель (который теперь находится во втором столбце); как вы можете видеть, предыдущий дочерний элемент теперь, очевидно, стал дочерним для нового элемента, в то время как новый дочерний элемент не виден:

column inserted, child of the previous parent is

Наконец Я пытаюсь удалить первый столбец, и ранее добавленный дочерний элемент теперь виден:

first column removed, previously added child is now visible

Как ни странно, если новый дочерний элемент предыдущего первый столбец добавляется за до вставки нового столбца (insertColumnAfter()), он работает "как положено", вероятно, из-за задержки, которую представления элементов обычно имеют до размещения элементов после изменения модели:

add a child item, then insert a new column

Опять же, я понимаю, что это не «стандартный» способ работы с моделью дерева.
Тем не менее, я хотел бы понять, что происходит здесь, будь то ожидаемое поведение (возможно, из-за замысла, даже если оно не идеально) или какая-то ошибка.

Я смог воспроизвести это поведение с PyQt до 5.12.4, я могу ' t-тест с более новыми версиями.

...