在QAbstractListModel中调用data()

时间:2011-02-03 11:05:26

标签: qt4 pyqt4

我正在尝试学习Qt的模型 - 视图架构,我想知道为什么在下面的代码中,在双击它之后编辑项目时会连续调用data()?

在这个模型中,它不是一个真正的问题,因为它是一个简单的五项列表,但Qt似乎在连续查找模型中所有行/列的数据。这是预期的行为,还是我错过了一些避免这样的代码片段,因此对文件/对象没有额外的,可能是昂贵的调用,而模型可以访问这些数据?

如果它有所作为,我正在使用PyQt4 v4.8.2。提前谢谢!

from PyQt4 import QtCore, QtGui

class Model(QtCore.QAbstractListModel):

    def __init__(self):
        QtCore.QAbstractTableModel.__init__(self)
        self.table = ["Item 1", "Item 2", "Item 3", "Item 4", "Item 5"]
        self.i = 0

    def setData(self, index, value, role = QtCore.Qt.EditRole):
        value = QtCore.QVariant.toPyObject(value)
        print "setData:",value

        row = index.row()
        self.table[row] = value

        self.emit(QtCore.SIGNAL("dataChanged( const QModelIndex&, const QModelIndex& )"), index, index)
        return True

    def rowCount(self,parent):
        return 5

    def flags(self, index):
        return QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled

    def data(self,index,role):
        if role == QtCore.Qt.DisplayRole or role == QtCore.Qt.EditRole:
            row = index.row()
            self.i = self.i + 1
            print self.i
            return self.table[row]

if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)

    m = Model()

    view = QtGui.QListView()
    view.setModel(m)
    view.show()

    view2 = QtGui.QTableView()
    view2.setModel(m)

    view.show()
    view2.show()
    app.exec_()
    sys.exit()

2 个答案:

答案 0 :(得分:1)

我相信每次Qt重新绘制你的GUI(比如用户上下滚动,让窗口聚焦等)Qt会重绘,那就是它会调用.data()

答案 1 :(得分:0)

这可能只是调试器。到达断点时,如果调试器绘制了列表视图,那么一旦继续执行,它就会重新绘制。尝试保持调试器和列表视图在屏幕上彼此分开,看看这是否会发生任何变化。