为什么我的 QStandardItemModel itemFromIndex 方法 return None? (索引无效)

Why does my QStandardItemModel itemFromIndex method return None? (index invalid)

我正在尝试制作一个带有复选框的列表视图,当按下 enter/return 键 时,该复选框会选中所选的框。我通过覆盖我的 MainWindow 的事件过滤器来做到这一点(是的,我应该将它子类化,但我无法让它工作)

在事件过滤器中,我得到了从 itemFromIndex 方法返回的 None 值,即使我只是通过了索引a .isValid() 没有问题。显然我遗漏了一些东西,但我想不通——它是在看完全不同的指数吗?模型没更新?

欢迎就替代方法提出任何建议

这是我用项目填充模型 (QStandardItemModel) 的方法,它仅在我加载文件时调用。

    def update_siNLV(self,names,model):

        model.clear()

        for name in names:            
            item = Qg.QStandardItem(name)
            item.setCheckState(Qc.Qt.Unchecked)
            item.setCheckable(True)
            model.appendRow(item)

这来自 init 方法,我在其中为选择模型创建了一个变量,并在我的 QListView[=15= 上安装了事件过滤器]

    self.sigInSelection = self.siNLV.selectionModel()
    self.siNLV.installEventFilter(self)

eventFilter 方法看起来像这样,并且该方法的过滤部分有效(我已经让它通过按回车键打印选定的索引)

    def eventFilter(self,receiver,event):
        if event.type() == QtCore.QEvent.KeyPress:
            if event.key() == QtCore.Qt.Key_Return or event.key() == Qc.Qt.Key_Enter:

                indexes = self.sigInSelection.selectedIndexes()

                for index in indexes:
                    if index.isValid():                        
                        print(str(index.row())+" "+str(index.column()))                                   
                        item = self.sigInModel.itemFromIndex(index)
                        item.setCheckState(qtCore.Qt.Checked)                     
                return True

    return super(form,self).eventFilter(receiver,event)

如评论中所述:

QItemSelectionModel.selectedIndexes() 返回的索引来自视图,并与视图与其直接模型之间的连接有关。可以通过调用 QModelIndex.model() 找到该模型的身份,在这种情况下,它不是您想要的模型:它是介于您想要的 QStandardItemModel 和视图之间的代理模型。

要获得您需要的模型,您需要使用 QAbstractProxyModel.mapToSource()。所以你可以使用这样的代码:

source_index = self.proxy.mapToSource(index)
item = self.sigInModel.itemFromIndex(source_index)

更一般地说,您可以遍历任意代理结构,并通过如下代码避免这种对单个已知代理的硬编码使用:

proxy_model = index.model()
while proxy_model != self.sigInModel:
    index = proxy_model.mapToSource(index)
    proxy_model = index.model()
item = self.sigInModel.itemFromIndex(index)

但在您知道有一个简单的单一代理的情况下,这可能有点矫枉过正。