Qt:QAbstractItemModel中的setData方法

时间:2013-12-26 12:04:18

标签: python qt qtgui qabstractitemmodel qabstractlistmodel

我是模型视图的新手,我在检查文档的同时一直关注this tutorial,我偶然发现了这个小细节:可以下载的教程代码here在QAbstractItemModel类(这里是QAbstractListModel)中有setData方法,其代码是:

def setData(self, index, value, role = QtCore.Qt.EditRole):
    if role == QtCore.Qt.EditRole:

        row = index.row()
        color = QtGui.QColor(value)

        if color.isValid():
            self.__colors[row] = color
            self.dataChanged.emit(index, index)
            return True
    return False

根据教程中的解释和我从文档中理解的内容,如果函数返回True,则视图会更新,如果返回false,则没有任何反应,但是当我将代码更改为:

def setData(self, index, value, role = QtCore.Qt.EditRole):
    if role == QtCore.Qt.EditRole:

        row = index.row()
        color = QtGui.QColor(value)

        if color.isValid():
            self.__colors[row] = color
            self.dataChanged.emit(index, index)
            return False # This is what I changed in the code
    return False

我意识到如果color.isValid()即使函数返回False,视图仍然会更新。我是否误解了setData方法中的返回角色,还是一个错误?

作为参考,我使用的是PySide 1.2.1,而不是PyQt4。

2 个答案:

答案 0 :(得分:3)

引用有关setData的视频教程:

  

...如果操作成功,此函数需要返回true,   否则视图不会自行更新。

严格来说,这种说法是错误的。 QAbstractItemModel的文档仅表示如果数据设置成功,则setData返回true,否则返回false;它没有提到这可能带来的后果。具体来说,它没有提及有关更新视图的任何内容。

查看Qt源代码,setData 的返回值会在几个地方进行检查,其中一些检查可以有时帮助触发更新。但实际上有几十种东西可以触发更新,因此setData的返回值对于更新项目绝不是必不可少的。

或许更准确地说setData 应该返回true,否则视图可能不会自行更新(在某些情况下)。< / p>

答案 1 :(得分:2)

  

我是否误解了setData方法中的返回角色,还是一个错误?

来自Qt documentation

  

bool QAbstractItemModel :: setData(const QModelIndex&amp; index,const QVariant&amp; value,int role = Qt :: EditRole)[virtual]

     

将index处的项目的角色数据设置为值。

     

如果成功则返回true;否则返回false。

     

如果数据成功设置,则应发出dataChanged()信号。

     

基类实现返回false。必须为可编辑模型重新实现此函数和data()。

然而,即使未根据返回值成功设置数据,您似乎也会发出dataChanged()信号。此外,您似乎参考的教程是在代码中使用self.__colors,`data()和其他方法的rowCount()集。如果您想避免更新,则需要在任何此类声明之前返回False。

您需要注意这些标准,因为信号和颜色是在内部管理的,而调用者使用返回值来查看setData()方法是否已成功设置。

根据上述知识,您应该编写此代码,以便第二次尝试使其按预期工作:

def setData(self, index, value, role = QtCore.Qt.EditRole):
    if role == QtCore.Qt.EditRole:

        row = index.row()
        color = QtGui.QColor(value)

        if color.isValid():
            return False
    return False