Я пытаюсь понять странное (на мой взгляд) поведение при попытке вставить столбец в древовидную структуру с индексом 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](https://i.stack.imgur.com/ZqWwy.png)
Затем я вставляю новый первый столбец, затем Я добавляю дочерний элемент к предыдущий родитель (который теперь находится во втором столбце); как вы можете видеть, предыдущий дочерний элемент теперь, очевидно, стал дочерним для нового элемента, в то время как новый дочерний элемент не виден:
![column inserted, child of the previous parent is](https://i.stack.imgur.com/JCKZl.png)
Наконец Я пытаюсь удалить первый столбец, и ранее добавленный дочерний элемент теперь виден:
![first column removed, previously added child is now visible](https://i.stack.imgur.com/8AvwG.png)
Как ни странно, если новый дочерний элемент предыдущего первый столбец добавляется за до вставки нового столбца (insertColumnAfter()
), он работает "как положено", вероятно, из-за задержки, которую представления элементов обычно имеют до размещения элементов после изменения модели:
![add a child item, then insert a new column](https://i.stack.imgur.com/HWu5c.png)
Опять же, я понимаю, что это не «стандартный» способ работы с моделью дерева.
Тем не менее, я хотел бы понять, что происходит здесь, будь то ожидаемое поведение (возможно, из-за замысла, даже если оно не идеально) или какая-то ошибка.
Я смог воспроизвести это поведение с PyQt до 5.12.4, я могу ' t-тест с более новыми версиями.