Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python QabstracteModel index()和parent()方法_Python_Qt_Model_Pyqt_Qabstractitemmodel - Fatal编程技术网

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。。。我真的被我们使用的术语弄糊涂了。。。比如“它回来了”。。。。从哪里回来?我真的很想了解