gpt4 book ai didi

python - pyqt treeview 索引错误删除最后一行

转载 作者:太空宇宙 更新时间:2023-11-04 10:30:56 25 4
gpt4 key购买 nike

我有一个 2 列的 treeView,其简单层次结构深度为 2;根 > parent > child 。我的 treeView 子类中有一个 removeRows 调用,当按下删除键时它会被评估。当我删除除最后一行以外的任何行时,这似乎工作正常。

我收到一个 IndexError: list index out of range,它似乎来自节点类 child 方法。这似乎是在模型的 removeRows 中调用 self.beginRemoveRows 方法时发生的。奇怪的是,操作顺序似乎颠倒了,或者线程以某种方式导致在模型知道它的最新更新之前发生刷新。

通过这些代码片段,我希望有人可以提供可能的解释或关于接下来要尝试什么来调试它的一些想法。

来自 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

最佳答案

我花了一些时间,但我终于找到了错误的原因:根据这个mailindex 方法中,您应该在继续之前检查索引是否存在。恼人的是它没有写在 method description 中,也不在 qt4 或 qt5 文档中。

index 方法的正确实现应该是这样的:

def index(self, row, column, parent=QModelIndex()):
if self.hasIndex(row, column, parentIndex):
parent_node = self.getNode(parent)
child_item = parent_node.child(row)
if child_item:
return self.createIndex(row, column, child_item)
else:
return QModelIndex()

在我的应用程序中,这解决了这个问题。

关于python - pyqt treeview 索引错误删除最后一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26680168/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com