PyQt的QAbstractTableModel在添加行时从未更新

3
我有一个PyQt的QTableView,与一个QAbstractTableModel连接,这个模型又连接到一个管理项目列表的自定义类。我可以在列表末尾插入项目,并适当地通知我的模型,然后调用beginInsertRows和endInsertRows函数。我可以验证它调用了这两个函数,列表也已更新,但表格不会调用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个回答

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。不需要另一个名称。同样,你应该能够从figures中获取COLUMNS,或者如果需要明确的值,应该将其传递给__init__


了解“index”和“createIndex”确实是件好事,因为文档中并不是很清楚。至于全局变量,“COLUMNS”和“EMPTY”都基本上是静态常量(根据文档,“EMPTY”是无效的“QVariant”)。而全局变量“figures”的存在是因为“figures”是单例;在UI中只有这些表中的一个。 - Chris B.
@ChrisB.:关于createIndex...从技术上讲,在任何地方使用它都没有问题,但是没有太多的理由这样做。通常只有indexparent需要创建一个QModelIndex。其他方法可以向这些方法请求索引。 - Avaris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接