【发布时间】:2015-01-10 02:41:50
【问题描述】:
必须实现QAbstractItemModel.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)
.index() 方法示例:
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(row, column, dataVariable)方法。所以他们都做同样的事情:他们创建 QModelIndexes。我只是不明白为什么我们需要两种方法来做同样的事情!而且很难调试它,因为它们似乎在无限循环中运行......
【问题讨论】:
-
是什么阻止你阅读Qt documentation on the subject?
-
嗨,Ekhumoro! Qt 文档示例大多使用 C 语言(至少它的 MVC 教程)。
-
从无休止的测试中,我确实看到
.parent()方法仅在顶级 QTableView 项目上调用。虽然为所有项目调用.index():顶级、二级子项目、三级孙项目等。我也确实看到两者都返回 QModelIndex,其中行、列和数据变量“链接”到它。看起来这两种方法返回的 QModelIndexes 应该是同步的。 -
.parent()返回具有给定索引的模型项的父项。如果 item 没有父级,则返回无效的 QModelIndex。公开树数据结构的模型中使用的一个常见约定是只有第一列中的项目有子项。对于这种情况,在子类中重新实现此函数时,返回的 QModelIndex 的列将为 0。在子类中重新实现此函数时,请注意避免调用 QModelIndex 成员函数,例如 QModelIndex::parent(),因为索引属于到你的模型只会调用你的实现导致无限递归。 -
.index()返回由给定行、列和父索引指定的模型中的项目的索引。在子类中重新实现此函数时,调用 createIndex() 以生成模型索引,其他组件可以使用这些索引来引用模型中的项目。
标签: python qt model pyqt qabstractitemmodel