Python qtreeview数据不一致

Python 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

在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(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在视图内部编辑时是如何将视图和模型联系在一起的。