Python qtreeview数据不一致
在PyQt示例中,我有一个基于editabletreemode.py的QTreeView GUI。在模型内部,为了满足需要,我重新实现了setData():对于一些超出界限的值,我返回False,否则返回TruePython qtreeview数据不一致,python,model-view-controller,qt,Python,Model View Controller,Qt,在PyQt示例中,我有一个基于editabletreemode.py的QTreeView GUI。在模型内部,为了满足需要,我重新实现了setData():对于一些超出界限的值,我返回False,否则返回True def setData(self, index, value, role=QtCore.Qt.EditRole): if role != QtCore.Qt.EditRole: return False item = self.getItem(inde
def setData(self, index, value, role=QtCore.Qt.EditRole):
if role != QtCore.Qt.EditRole:
return False
item = self.getItem(index)
result = item.setData(index.column(), value)
if result:
self.dataChanged.emit(index, index)
self.modified = True
print "setData() returning ", result
return result
问题是,即使setData返回False,GUI仍然接受更改后的值。因此,我现在在模型和视图之间有不一致的数据。对我来说有意义的是,当setData()返回False以拒绝该值时,视图应该恢复为旧值。这可能吗
[已解决]
实际上,setData()的返回值似乎并不重要。QTreeView似乎调用data(),以在以后重新检索该值。我遇到的问题是,setData()更改了内部数据,尽管它返回False
如果有人能向我解释setData()的返回值用于什么,那就太好了。我能看到的唯一问题是
.setData()
的签名,它是.setData(索引、值、角色)
。您的代码片段和问题的描述都不够详细,无法说明其他内容
编辑:事实上,在查看Qt源代码后,我得到了纠正。与我在本次编辑之前所述的不同,视图实际上不使用.setData()
的返回值
数据由委托的.setModelData()
提交到模型。通常,Qt使用QStyledItemDelegate
,其.setModelData()
方法实际上忽略了.setData()
的返回值。因此,视图实际上并不关心数据是否成功设置。当视图中某个单元格的编辑器关闭时,视图只显示该单元格的当前值(由.data()
检索)
但是,
.setData()
的返回值仍然很重要,行为良好的模型应该注意返回正确的值。模型通常抽象数据源,并且独立于视图。因此,模型也可以直接访问,在这种情况下,调用方需要检查.setData()
的返回值,以了解操作是否成功。感谢您的回复。我已经更改了方法签名。我已打印出返回值,它确实为False。是否添加了print
语句以验证视图是否实际调用了.setData()
?我已使用真实代码进行了更新。我可以看到返回了False,但是视图仍然用错误的值更新。什么是val
?是不是应该是value
?@lang2:我已经根据你的解决方案编辑了我的答案。很抱歉这么麻烦,我确实误解了Qt在视图内部编辑时是如何将视图和模型联系在一起的。