gpt4 book ai didi

python - PyQt QAbstractTableModel 在添加行时从不更新

转载 作者:行者123 更新时间:2023-11-28 16:46:48 27 4
gpt4 key购买 nike

我有一个 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)

最佳答案

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

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

self.createIndex(0, 0) 将创建一个有效的 QModelIndex。这指的是 beginInsertRows 中的 parent ,所以您基本上是在告诉 View 您将向表的第一行添加一个子项。由于该表没有子项的概念(它不是分层的),因此它不执行任何操作。

对于表,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__

关于python - PyQt QAbstractTableModel 在添加行时从不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13109128/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com