我有一个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)
答案 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__
。