2

在此处输入图像描述

代码创建单个QTableView. 启用了列排序。当我单击列名时(1,2 或 3 没有任何反应)。如何在不使用代理模型的情况下使这种排序工作?

from PyQt4 import QtCore, QtGui
app = QtGui.QApplication([])

class Model(QtCore.QAbstractTableModel):
    def __init__(self):
        QtCore.QAbstractTableModel.__init__(self)
        self.items = [[1, 'one', 'ONE'], [2, 'two', 'TWO'], [3, 'three', 'THREE']]

    def flags(self, index):
        return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsEditable

    def rowCount(self, parent=QtCore.QModelIndex()):
        return 3 
    def columnCount(self, parent=QtCore.QModelIndex()):
        return 3

    def data(self, index, role):
        if not index.isValid(): return 

        if role in [QtCore.Qt.DisplayRole, QtCore.Qt.EditRole]:
            return self.items[index.row()][index.column()]

def onClick(index):
    tableView.openPersistentEditor(tableView.model().index(index.row(), index.column()))
    print 'clicked index:  %s'%index

tableModel=Model()
tableView=QtGui.QTableView() 
tableView.setModel(tableModel)
tableView.clicked.connect(onClick)
tableView.setSortingEnabled(True)

tableView.show()
app.exec_()
4

3 回答 3

3

我不是 python 开发人员,但您的模型中似乎没有sort()实现任何方法。

在 C++ 中,当您从QAbstractItemModel(或QAbstractTableModel) 派生自定义模型时,您必须实现该QAbstractItemModel::sort()方法才能启用排序。

于 2016-05-20T05:06:26.237 回答
3

尽管@alphanumeric 不想使用 ProxyModel,但也许其他人会这样做,因为它只需要 2 行额外的代码:

from PySide import QtCore, QtGui
app = QtGui.QApplication([])

class Model(QtCore.QAbstractTableModel):
    def __init__(self):
        QtCore.QAbstractTableModel.__init__(self)
        self.items = [[1, 'one', 'ONE'], [2, 'two', 'TWO'], [3, 'three', 'THREE']]

    def flags(self, index):
        return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsEditable

    def rowCount(self, parent=QtCore.QModelIndex()):
        return 3
    def columnCount(self, parent=QtCore.QModelIndex()):
        return 3

    def data(self, index, role):
        if not index.isValid(): return

        if role in [QtCore.Qt.DisplayRole, QtCore.Qt.EditRole]:
            return self.items[index.row()][index.column()]


tableModel=Model()
tableView=QtGui.QTableView()

proxyModel = QtGui.QSortFilterProxyModel()
proxyModel.setSourceModel(tableModel)

tableView.setModel(proxyModel)
tableView.setSortingEnabled(True)

tableView.show()
app.exec_()
于 2017-07-28T08:48:05.933 回答
-3

感谢托马斯的指导!

以下是 PyQt 中的工作解决方案:

在此处输入图像描述

from PyQt4 import QtCore, QtGui
app = QtGui.QApplication([])

class Model(QtCore.QAbstractTableModel):
    def __init__(self):
        QtCore.QAbstractTableModel.__init__(self)
        self.items = [[1, 'one', 'ONE'], [2, 'two', 'TWO'], [3, 'three', 'THREE']]

    def flags(self, index):
        return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsEditable

    def rowCount(self, parent=QtCore.QModelIndex()):
        return 3 
    def columnCount(self, parent=QtCore.QModelIndex()):
        return 3

    def data(self, index, role):
        if not index.isValid(): return 

        if role in [QtCore.Qt.DisplayRole, QtCore.Qt.EditRole]:
            return self.items[index.row()][index.column()]

    def sort(self, column=None, direction=None):
        print 'Model.sort: column: %s, direction: %s'%(column, direction)


tableModel=Model()
tableView=QtGui.QTableView() 
tableView.setModel(tableModel)
tableView.setSortingEnabled(True)

tableView.show()
app.exec_()
于 2016-05-20T05:20:15.247 回答