qtreeview数据不一致

时间:2011-10-04 09:07:26

标签: 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(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()来重新检索值。我遇到的问题是因为s​​etData()改变了内部数据,即使它返回False。

如果有人能向我解释一下setData()的返回值是什么,那就太好了。

1 个答案:

答案 0 :(得分:1)

我能看到的唯一问题是.setData()的签名,即.setData(index, value, role)。您的代码段和问题描述都不够详细,无法说出任何其他内容。

编辑:的确,在查看了Qt消息来源后,我立即纠正了。与我在此编辑之前所述的不同,视图实际上并未使用.setData()的返回值。

数据由委托的.setModelData()提交给模型。通常,Qt使用QStyledItemDelegate,其.setModelData()方法实际上忽略了.setData()的返回值。因此,视图确实不关心数据是否成功设置。当视图中单元格的编辑器关闭时,视图只显示该单元格的值(由.data()检索)。

但是,.setData()的返回值仍然很重要,行为良好的模型应注意返回适当的值。模型通常抽象数据源,并且本身独立于视图。因此,模型也可以直接访问,在这种情况下,调用者需要检查.setData()的返回值,以了解操作是否成功。