Python 添加行时,PyQt QAbstractTableModel从不更新
我有一个PyQtPython 添加行时,PyQt QAbstractTableModel从不更新,python,qt,pyqt,Python,Qt,Pyqt,我有一个PyQtQTableView,连接到一个QAbstractTableModel,它本身连接到一个管理项目列表的自定义类。我可以在列表的末尾插入一个项目,它会适当地通知我的模型,然后模型会调用beginInsertRows和endInsertRows。我可以验证它是否调用了这两个函数,并且列表本身已经更新,但是该表从不调用数据来检索更新的行 发生什么事了?我怎样才能修好它 class FigureTableModel(QAbstractTableModel): def __init
QTableView
,连接到一个QAbstractTableModel
,它本身连接到一个管理项目列表的自定义类。我可以在列表的末尾插入一个项目,它会适当地通知我的模型,然后模型会调用beginInsertRows
和endInsertRows
。我可以验证它是否调用了这两个函数,并且列表本身已经更新,但是该表从不调用数据
来检索更新的行
发生什么事了?我怎样才能修好它
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
。这指的是中的parent
,因此您基本上是在告诉视图您将向表中的第一行添加一个子项。因为这个表没有子对象的概念(它不是层次结构),所以它什么都不做
对于表,parent
应该是无效的QModelIndex
,这意味着您的项位于根目录下。因此,您应该使用:
self.beginInsertRows(QtCore.QModelIndex(), index, index)
# or depending on how you import
self.beginInsertRows(QModelIndex(), index, index)
尽管如此,有几件事让我觉得很奇怪
首先,在index
方法之外,通常应该避免直接调用createIndex
。否则很容易把事情搞砸<代码>索引方法本身应该提供创建QModelIndex
实例的一致方法。在您的例子中,由于继承了QAbstractTableModel
,索引
方法已经实现
其次,您正在使用全局变量。很多这通常被认为是坏习惯。如果您的类需要它们,请将它们传递给
\uuuu init\uuuu
。例如,现在不能实例化两个独立的模型。因为它们都将使用相同的全局figure
变量。或者,我不知道EMPTY
指的是什么,但是data
对于无效的类型应该简单地返回None
。不需要另一个名字。类似地,您应该能够从图中获取列
,或者如果需要显式值,您应该将其传递给\uuuuu init\uuuuu
很好地了解索引
和创建索引
。从文件上看不太清楚。至于全局变量,列
和空
基本上都是静态常量(空
是无效的QVariant
,根据文档)。而全局数字
之所以存在,是因为数字
是一个单体;UI中只有一个表。@ChrisB.:AboutcreateIndex
。。。从技术上讲,在任何地方使用它都没有错,但没有太多理由这样做。通常只有索引
和父项
才需要创建QModelIndex
。其他方法可以向这些方法请求索引。