我在QTreeView示例中有一个基于editabletreemode.py的PyQt图形用户界面。在模型内部,我根据需要重新实现了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时,图形用户界面仍然接受更改后的值。所以我现在在模型和视图之间有不一致的数据。对我来说有意义的是,当setData()返回False以拒绝该值时,视图应该恢复为旧值。这个是可能的吗?
实际上解决了setData()的返回值似乎无关紧要。无论如何,QTreeView似乎调用data()来重新检索值。我遇到的问题是因为setData()更改了内部数据,即使它返回False。
如果有人能向我解释一下setData()的返回值是用来做什么的,那就太好了。
发布于 2011-10-04 18:38:01
我能看到的唯一问题是.setData(index, value, role)的.setData()签名。您的代码片段和对问题的描述都不够冗长,不足以说明任何其他问题。
编辑:确实,在看了Qt源代码之后,我改正了。与我之前提到的编辑不同,视图实际上并没有使用.setData()的返回值。
数据由委托的.setModelData()提交给模型。通常,Qt使用QStyledItemDelegate,它的.setModelData()方法实际上忽略了.setData()的返回值。因此,视图实际上并不关心数据是否已成功设置。当视图中某个单元格的编辑器关闭时,视图仅显示该单元格的当前值(由.data()检索)。
但是,.setData()的返回值仍然很重要,行为良好的模型应该注意返回一个适当的值。模型通常抽象数据源,并且它们本身独立于视图。因此,也可以直接访问模型,在这种情况下,调用者需要检查.setData()的返回值,以了解操作是否成功。
https://stackoverflow.com/questions/7645555
复制相似问题