Qt:QAbstractItemModel中的setData方法

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.

ekh*_*oro 5

引用视频教程中的内容setData

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

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

查看 Qt 源代码,setData 确实在几个地方检查了返回值,其中一些检查有时可以帮助触发更新。但实际上有很多东西可以触发更新,因此返回值setData对于更新项目来说并不重要。

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