PyQt QAbstractTableModel在添加行时永远不会更新

时间:2012-10-28 13:22:58

标签: python qt pyqt

我有一个PyQt QTableView,连接到QAbstractTableModel,它本身连接到管理项目列表的自定义类。我可以在列表的末尾插入一个项目,并适当地通知我的模型,然后调用beginInsertRowsendInsertRows。我可以验证它是否同时调用这些函数,并且列表已自行更新,但该表从不调用data来检索更新的行。

发生了什么事?我该如何解决?

class FigureTableModel(QAbstractTableModel):
    def __init__(self):
        QAbstractTableModel.__init__(self)

        def changed(index):
            start_index = self.createIndex(index, 0)
            end_index = self.createIndex(index, COLUMNS - 1)
            self.dataChanged.emit(start_index, end_index)

        def adding_row(index):
            self.beginInsertRows(self.createIndex(0, 0), index, index)
            print 'adding ', index

        def added_row(index):
            self.endInsertRows()
            print 'added'

        figures.dataChanged.connect(changed)
        figures.rowAdding.connect(adding_row)
        figures.rowAdded.connect(added_row)

    def rowCount(self, parent):
        return len(figures)

    def columnCount(self, parent):
        return COLUMNS

    def data(self, index, role):
        print 'in data'
        if not index.isValid():
            return EMPTY

        return figures[index.row()].get_table_item(index.column(), role)

1 个答案:

答案 0 :(得分:3)

有一个问题,我认为是问题的原因。这是关于线:

self.beginInsertRows(self.createIndex(0, 0), index, index)

self.createIndex(0, 0)将创建有效的QModelIndex。这指的是beginInsertRows中的parent,因此您基本上是在告诉您将要将子项添加到表格的第一行。由于该表没有子项概念(它不是分层的),因此它没有做任何事情。

对于表格,parent应该是无效的QModelIndex,这意味着您的商品位于根目录中。所以,你应该使用:

self.beginInsertRows(QtCore.QModelIndex(), index, index)
# or depending on how you import
self.beginInsertRows(QModelIndex(), index, index)

话虽这么说,有几件事让我感到奇怪。

首先,在index方法之外,您通常应该避免直接调用createIndex。否则很容易弄乱。 index方法本身应该提供创建QModelIndex实例的一致方法。在您的情况下,由于您继承了QAbstractTableModel,因此index方法已经实施。

其次,您正在使用全局变量。很多。这通常被认为是不好的做法。如果您的课程需要,请将其传递给__init__。例如,现在您无法实例化两个独立模型。因为它们都使用相同的全局figure变量。或者,我不知道EMPTY引用了什么,但data应该只返回None作为无效类型。不需要另一个名字。同样,您应该可以从COLUMNS获取figures,或者如果您需要显式值,则应将其传递给__init__