QAbstractItemModel index()和parent()方法

alp*_*ric 6 python qt model pyqt qabstractitemmodel

它需要实现QAbstractItemModel.parent()方法或否则得到这个讨厌的错误:

NotImplementedError: QAbstractItemModel.parent() is abstract and must be overridden
Run Code Online (Sandbox Code Playgroud)

除了.parent()index()方法还需要被覆盖或面对:

NotImplementedError: QAbstractItemModel.index() is abstract and must be overridden
Run Code Online (Sandbox Code Playgroud)

问题:两种方法的目的是什么,它们的工作方式有何不同?

稍后编辑:

.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)
Run Code Online (Sandbox Code Playgroud)

.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()
Run Code Online (Sandbox Code Playgroud)

从无休止的测试中,我确实看到该.parent()方法仅在顶级QTableView项目上调用.虽然.index()被调用所有项目:顶级,二级子项目,三级孙子项目等.我也看到两者都返回QModelIndex行,列和数据变量"链接"到它.看起来两个方法返回的QModelIndexes应该是同步的.

.parent()具有给定索引的模型项的返回父级.如果item没有父项,QModelIndex则返回invalid .在公开树数据结构的模型中使用的常见约定是只有第一列中的项目具有子项.对于这种情况,当在子类中重新实现此函数时,返回的列QModelIndex将为0.在子类中重新实现此函数时,请小心避免调用QModelIndex成员函数,例如QModelIndex::parent(),因为属于您的模型的索引将只调用您的实现导致无限递归.

.index()回报的项目中由给定的行,列和父索引指定的模型索引.在子类中重新实现此函数时,请调用createIndex()生成模型索引,其他组件可以使用这些索引来引用模型中的项.

值得一提的是,这两种方法都使用self.createIndex(row, column, dataVariable)方法.所以他们都做同样的事情:他们创建QModelIndexes.我只是不明白为什么我们需要两种方法来做同样的事情!它很难调试,因为它似乎在无限循环中运行....

Nej*_*jat 5

这些方法被定义为抽象的,以强制用户在子类化时实现它们。如果不实现它们,您的模型将无法工作,因为它们是定义模型结构所必需的。

通常当你想创建一个分层模型时,你应该实现index()parent()方法。对于表和列表模型,在许多情况下,子类化就足够了,QAbstractListModel并且QAbstractTableModel它们具有这两种方法的默认实现。

简单地说QAbstractItemModel.parent()QModelIndex从子项返回父项,并QAbstractItemModel.index()在模型或视图需要QModelIndex为特定子项(或顶级项,如果父项无效QModelIndex)创建时调用。