Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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 在对数据源进行排序后,如何更新QAbstractTableModel和QTableView?_Python_Sorting_Pyqt_Qtableview_Qabstractitemmodel - Fatal编程技术网

Python 在对数据源进行排序后,如何更新QAbstractTableModel和QTableView?

Python 在对数据源进行排序后,如何更新QAbstractTableModel和QTableView?,python,sorting,pyqt,qtableview,qabstractitemmodel,Python,Sorting,Pyqt,Qtableview,Qabstractitemmodel,我有一个自定义数据结构,我想使用QTableView在PyQt应用程序中显示它。我正在使用QAbstractTableModel的一个子类与数据通信。数据结构本身位于单独的模块中,对PyQt一无所知 使用QTableView显示和编辑数据是可行的,但现在我想对数据进行排序,然后更新模型和视图 在阅读QAbstractTableModel及其祖先QAbstractItemModel的Qt文档后,我的第一个方法是尝试以下方法: class MyModel(QtCore.QAbstractTableM

我有一个自定义数据结构,我想使用QTableView在PyQt应用程序中显示它。我正在使用QAbstractTableModel的一个子类与数据通信。数据结构本身位于单独的模块中,对PyQt一无所知

使用QTableView显示和编辑数据是可行的,但现在我想对数据进行排序,然后更新模型和视图

在阅读QAbstractTableModel及其祖先QAbstractItemModel的Qt文档后,我的第一个方法是尝试以下方法:

class MyModel(QtCore.QAbstractTableModel):
    __init__(self, data_structure):
        super().__init__()
        self.data_structure = data_structure

    # ...

    def sort_function(self):
        self.layoutAboutToBeChanged.emit()
        # custom_sort() is built into the data structure
        self.data_structure.custom_sort()
        self.layoutChanged.emit()
但是,这无法更新视图。我还尝试对模型使用的所有数据发出dataChanged信号,但这也无法更新视图

我做了进一步的研究。如果我理解正确,问题是模型中的QPersistentModelIndex没有得到更新,解决方法是以某种方式手动更新它们


有更好的方法吗?如果没有,我将如何更新它们(最好不必编写跟踪每个索引更改的新排序函数)?

自定义排序()函数中存在错误。在修复它之后,我在这里描述的方法是有效的

class MyModel(QtCore.QAbstractTableModel):
    __init__(self, data_structure):
        super().__init__()
        self.data_structure = data_structure

    # ...

    def sort_function(self):
        self.layoutAboutToBeChanged.emit()
        # custom_sort() is built into the data structure
        self.data_structure.custom_sort()
        self.layoutChanged.emit()

您的代码应该可以工作,不必担心这里的持久索引。我编写的模型发出的信号与您的
sort\u函数相同,并正确更新视图。你确定你的函数被调用了吗,
custom_sort()
实际上改变了数据,这些改变通过你的模型的
data()
方法反映出来了吗?@FerdinandBeyer啊,这就是问题所在!我已经检查了数据是否正在更改,但没有考虑检查data()方法本身。custom_sort()正在复制某些需要进行排序的项目。非常感谢你!没问题。请随意发布您的解决方案作为答案,并接受它,这样这个问题将被标记为已回答!