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

时间:2016-09-02 13:53:57

标签: python qt pyqt qlistview qstandarditemmodel

我正在尝试使用复选框创建列表视图,以便在按下输入/返回键时检查所选框。我通过覆盖我的MainWindow的eventfilter来做到这一点(是的,我应该将其子类化,但我无法使其工作)

在eventfilter中,我从 itemFromIndex 方法返回值,即使我刚刚通过 .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 方法,我在其中为selectionmodel创建变量并在我的 QListView

上安装eventfilter
    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)

1 个答案:

答案 0 :(得分:1)

如评论中所述:

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)

但在这种情况下,你知道有一个简单的单一代理,这可能有点过分了。