Ily*_*iou 6 python qt qtgui qabstractitemmodel qabstractlistmodel
我是模型视图的新手,我在检查文档的同时也一直关注本教程,我偶然发现了这个小细节:可以在这里下载的教程代码在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
Run Code Online (Sandbox Code Playgroud)
根据教程中的解释和我从文档中理解的内容,如果函数返回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
Run Code Online (Sandbox Code Playgroud)
我意识到如果color.isValid()即使函数返回False,视图仍会更新.我是否误解了setData方法中的返回角色或者它是一个错误?
作为参考,我使用的是PySide 1.2.1,而不是PyQt4.
引用视频教程中的内容setData:
...如果操作成功,该函数需要返回 true,否则视图将不会自行更新。
严格来说,这种说法是错误的。QAbstractItemModel的文档只说setData如果数据设置成功则返回 true,否则返回 false;它没有提及这可能会产生什么后果。具体来说,它没有提及任何有关更新视图的内容。
查看 Qt 源代码,setData 确实在几个地方检查了返回值,其中一些检查有时可以帮助触发更新。但实际上有很多东西可以触发更新,因此返回值setData对于更新项目来说并不重要。
也许更准确地说应该setData 返回true,否则视图可能不会自行更新(在某些情况下)。