我在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以拒绝该值时,view应该恢复为旧值。这可能吗?
[解决] 实际上setData()的返回值似乎并不重要。无论如何,QTreeView似乎调用data()来重新检索值。我遇到的问题是因为setData()改变了内部数据,即使它返回False。
如果有人能向我解释一下setData()的返回值是什么,那就太好了。
答案 0 :(得分:1)
我能看到的唯一问题是.setData()
的签名,即.setData(index, value, role)
。您的代码段和问题描述都不够详细,无法说出任何其他内容。
编辑:的确,在查看了Qt消息来源后,我立即纠正了。与我在此编辑之前所述的不同,视图实际上并未使用.setData()
的返回值。
数据由委托的.setModelData()
提交给模型。通常,Qt使用QStyledItemDelegate
,其.setModelData()
方法实际上忽略了.setData()
的返回值。因此,视图确实不关心数据是否成功设置。当视图中单元格的编辑器关闭时,视图只显示该单元格的值(由.data()
检索)。
但是,.setData()
的返回值仍然很重要,行为良好的模型应注意返回适当的值。模型通常抽象数据源,并且本身独立于视图。因此,模型也可以直接访问,在这种情况下,调用者需要检查.setData()
的返回值,以了解操作是否成功。