Python QabstracteModel index()和parent()方法
需要实现Python QabstracteModel index()和parent()方法,python,qt,model,pyqt,qabstractitemmodel,Python,Qt,Model,Pyqt,Qabstractitemmodel,需要实现qabstractemmodel.parent()方法,否则会出现以下严重错误: NotImplementedError: QAbstractItemModel.parent() is abstract and must be overridden 除了.parent()之外,index()方法也需要重写或面对: NotImplementedError: QAbstractItemModel.index() is abstract and must be overridden 问题:
qabstractemmodel.parent()
方法,否则会出现以下严重错误:
NotImplementedError: QAbstractItemModel.parent() is abstract and must be overridden
除了.parent()
之外,index()
方法也需要重写或面对:
NotImplementedError: QAbstractItemModel.index() is abstract and must be overridden
问题:这两种方法的目的是什么?它们的工作方式有什么不同
稍后编辑:
.parent()
方法示例:
def getNodeFromIndex(self, index):
if index.isValid():
node = index.internalPointer()
if node:
return node
return self.items
def parent(self, index):
node = self.getNodeFromIndex(index)
parentNode = node.getParent()
if parentNode == self.items:
return QtCore.QModelIndex()
return self.createIndex(parentNode.row(), 0, parentNode)
def index(self, row, column, parentIndex):
parentNode = self.getNodeFromIndex(parentIndex)
childNode = parentNode.getChildren(row)
if childNode:
newIndex=self.createIndex(row, column, childNode)
return newIndex
else:
return QtCore.QModelIndex()
.index()
方法示例:
def getNodeFromIndex(self, index):
if index.isValid():
node = index.internalPointer()
if node:
return node
return self.items
def parent(self, index):
node = self.getNodeFromIndex(index)
parentNode = node.getParent()
if parentNode == self.items:
return QtCore.QModelIndex()
return self.createIndex(parentNode.row(), 0, parentNode)
def index(self, row, column, parentIndex):
parentNode = self.getNodeFromIndex(parentIndex)
childNode = parentNode.getChildren(row)
if childNode:
newIndex=self.createIndex(row, column, childNode)
return newIndex
else:
return QtCore.QModelIndex()
从无休止的测试中,我确实看到
.parent()
方法仅在顶级QTableView
项上调用。虽然为所有项调用了.index():顶级、二级子项、三级孙子项等等。我还看到它们都返回QModelIndex
,行、列和数据变量都“链接”到它。看起来两个方法返回的QModelIndexes应该是同步的
.parent()
返回具有给定索引的模型项的父项。如果项没有父项,则返回无效的QModelIndex
。在公开树数据结构的模型中使用的一个常见约定是,只有第一列中的项才有子项。在这种情况下,在子类中重新实现此函数时,返回的QModelIndex
列将为0。在子类中重新实现此函数时,请小心避免调用QModelIndex
成员函数,例如QModelIndex::parent()
,因为属于模型的索引只会调用实现,从而导致无限递归
.index()
返回给定行、列和父索引指定的模型中项的索引。在子类中重新实现此函数时,请调用createIndex()
,以生成模型索引,其他组件可用于引用模型中的项
值得一提的是,这两种方法都使用
self.createIndex(行、列、数据变量)
方法。所以它们都做同样的事情:它们创建QModelIndexes。我只是不明白为什么我们需要两种方法来做同样的事情!调试它很困难,因为它们似乎是在无限循环中运行的……这些方法是抽象定义的,以强制用户在子类化时实现它们。如果不实现它们,您的模型将无法工作,因为它们是定义模型结构所必需的
通常,当您想要创建层次模型时,应该实现index()
和parent()
方法。对于表和列表模型,在许多情况下,对QAbstractListModel
和QAbstractTableModel
进行子类化就足够了,这两种模型都有这两种方法的默认实现
简单地说,当模型或视图需要为特定子项(或者如果父项无效,则为顶级项)创建
QModelIndex
)时,从子项返回父项QModelIndex
,并调用qabstratemmodel.index()
.是什么阻止了你阅读这本书?嗨,Ekhumaro!Qt文档的示例大部分都是C语言(至少是MVC教程)。从无休止的测试中,我确实看到.parent()
方法仅在顶级QTableView项上调用。虽然为所有项目调用了.index()
:顶级、二级子项目、三级大孩子项目等。我还看到这两个项目都返回QModelIndex,并将行、列和数据变量“链接”到它。两个方法返回的QModelIndexes似乎应该同步。.parent()
返回具有给定索引的模型项的父项。如果项没有父项,则返回无效的QModelIndex。在公开树数据结构的模型中使用的一个常见约定是,只有第一列中的项才有子项。在这种情况下,在子类中重新实现此函数时,返回的QModelIndex列将为0。在子类中重新实现此函数时,请小心避免调用QModelIndex成员函数,例如QModelIndex::parent(),因为属于模型的索引只会调用实现,从而导致无限递归。.index()
返回给定行指定的模型中项的索引,列和父索引。在子类中重新实现此函数时,请调用createIndex()生成模型索引,其他组件可用于引用模型中的项。谢谢!我试图设计一个模型,以便在出现这种需要时可以为QTreeView进行扩展。我们可以说.parent()
方法用于为顶级项“创建”QModelIndex吗。和.index()
方法用于从顶级项为任何其他项创建QModelIndex?或者这样的说法是错误的?@Sputnix No,那完全是错误的index()
实际上用于创建模型中每个项目的QModelIndex
。它可以是顶级项,也可以是子项parent()
用于返回任何项的父项。在分层模型中,不同级别的许多项都有父项,只有顶级项没有父项,在父项中,应为它们返回parent()
中的无效QModelIndex
。我确实看到了.parent()
方法的内部(在我的原始帖子中,在#稍后编辑)下):如果它是作为参数接收的顶级索引,则此方法只返回QtCore.QModelIndex()
。但是,如果它不是顶级项,则此.parent()
方法继续,并通过使用:self.createIndex(parentNode.row(),0,parentNode)
创建一个新的QModelIndex
,其中parentNode
是一个数据变量,它“链接”到新创建的QModelIndex
。所以它确实创建了QModelIndex
es。。。我真的被我们使用的术语弄糊涂了。。。比如“它回来了”。。。。从哪里回来?我真的很想了解