我正在尝试使用复选框创建列表视图,以便在按下输入/返回键时检查所选框。我通过覆盖我的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)
答案 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)
但在这种情况下,你知道有一个简单的单一代理,这可能有点过分了。