У меня есть 2 столбца treeView с простой глубиной иерархии 2; корень > родитель > ребенок. У меня есть вызов removeRows в моем подклассе treeView, который оценивается при нажатии клавиши удаления. Кажется, это работает нормально, когда я удаляю любую строку, кроме последней.
Я получаю IndexError: list index out of range
, который, кажется, исходит от метода child
класса узла. Кажется, это происходит, когда метод self.beginRemoveRows
вызывается в модели removeRows
. Как ни странно, порядок операций кажется обратным, или потоки каким-то образом вызывают обновление до того, как модель узнает о своем недавнем обновлении.
С помощью этих фрагментов кода я надеялся, что кто-нибудь сможет дать возможное объяснение или некоторые идеи о том, что попробовать дальше, чтобы отладить это.
из подкласса QTreeView,
def keyPressEvent(self, event):
if event.key() == Qt.Key_Delete:
index = self.currentIndex()
self.model().removeRow(index.row())
else:
# call base class keyPressEvent
QTreeView.keyPressEvent(self, event)
из подкласса QAbstractItemModel,
def index(self, row, column, parent=QModelIndex()):
parent_node = self.getNode(parent)
child_item = parent_node.child(row)
if child_item:
return self.createIndex(row, column, child_item)
else:
return QModelIndex()
def getNode(self, index):
if index.isValid():
node = index.internalPointer()
if node:
return node
return self._root
def removeRows(self, position, rows, parent=QModelIndex()):
parent_node = self.getNode(parent)
self.beginRemoveRows(parent, position, position + rows - 1)
parent_node.removeChild(position)
self.endRemoveRows()
return True
из класса узла,
def child(self, row):
return self._children[row]
def removeChild(self, position):
if position < 0 or position >= len(self._children):
return False
child = self._children.pop(position)
child._parent = None
return True