Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 添加行时,PyQt QAbstractTableModel从不更新_Python_Qt_Pyqt - Fatal编程技术网

Python 添加行时,PyQt QAbstractTableModel从不更新

Python 添加行时,PyQt QAbstractTableModel从不更新,python,qt,pyqt,Python,Qt,Pyqt,我有一个PyQtQTableView,连接到一个QAbstractTableModel,它本身连接到一个管理项目列表的自定义类。我可以在列表的末尾插入一个项目,它会适当地通知我的模型,然后模型会调用beginInsertRows和endInsertRows。我可以验证它是否调用了这两个函数,并且列表本身已经更新,但是该表从不调用数据来检索更新的行 发生什么事了?我怎样才能修好它 class FigureTableModel(QAbstractTableModel): def __init

我有一个PyQt
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.:About
createIndex
。。。从技术上讲,在任何地方使用它都没有错,但没有太多理由这样做。通常只有
索引
父项
才需要创建
QModelIndex
。其他方法可以向这些方法请求索引。