微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

QTableView排序时如何保留选择

如何解决QTableView排序时如何保留选择

对表格进行排序时,如何保留项目的选择?在下面的示例中,选择始终固定在行索引上,即,如果我选择第一行,则在排序后总是选择第一行,而不是我选择的实际行。

import sys

from pyside2 import QtWidgets,QtGui,QtCore
from pyside2.QtCore import Qt


class TableModel(QtCore.QAbstractTableModel):
    def __init__(self,data):
        super().__init__()
        self._data = data

    def data(self,index,role):
        if role == Qt.displayRole:
            return self._data[index.row()][index.column()]

    def sort(self,column,order):
        if order == Qt.DescendingOrder:
            rev = True
        else:
            rev = False
        self.layoutAboutToBeChanged.emit()
        self._data.sort(key=lambda x: x[column],reverse=rev)
        self.layoutChanged.emit()

    def rowCount(self,parent=None):
        return len(self._data)

    def columnCount(self,parent=None):
        return len(self._data[0])


class Main(QtWidgets.QDialog):
    def __init__(self,data):
        super().__init__()
        self.layout = QtWidgets.QVBoxLayout()
        self.table = QtWidgets.QTableView()
        self.table.setSortingEnabled(True)
        self.table.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectionBehavior.SelectRows)
        self.model = TableModel(data)
        self.table.setModel(self.model)
        self.layout.addWidget(self.table)
        self.setLayout(self.layout)


def main():
    app = QtWidgets.QApplication(sys.argv)
    data = [
        [1,2,3,4],[5,6,7,8],[6,5,4,3],[2,1,9]
    ]
    m = Main(data)
    m.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

解决方法

在实现sort方法时,您正在修改数据,并且视图无法知道项目的新位置,而不是修改数据,您必须使用QSortFilterProxyModel来修改索引:

import sys

from PySide2 import QtCore,QtGui,QtWidgets


class TableModel(QtCore.QAbstractTableModel):
    def __init__(self,data):
        super().__init__()
        self._data = data

    def data(self,index,role):
        if role == QtCore.Qt.DisplayRole:
            return self._data[index.row()][index.column()]

    def rowCount(self,parent=None):
        return len(self._data)

    def columnCount(self,parent=None):
        return len(self._data[0])


class Main(QtWidgets.QDialog):
    def __init__(self,data):
        super().__init__()
        self.layout = QtWidgets.QVBoxLayout()
        self.table = QtWidgets.QTableView()
        self.table.setSortingEnabled(True)
        self.table.setSelectionBehavior(
            QtWidgets.QAbstractItemView.SelectionBehavior.SelectRows
        )
        self.model = TableModel(data)
        self.proxy = QtCore.QSortFilterProxyModel()
        self.proxy.setSourceModel(self.model)
        self.table.setModel(self.proxy)
        self.layout.addWidget(self.table)
        self.setLayout(self.layout)


def main():
    app = QtWidgets.QApplication(sys.argv)
    data = [[1,2,3,4],[5,6,7,8],[6,5,4,3],[2,1,9]]
    m = Main(data)
    m.show()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。