我是模型视图的新手,我在检查文档的同时一直关注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。
答案 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