如何在 Qt4 及更高版本中对 QTableView 进行排序
Posted
技术标签:
【中文标题】如何在 Qt4 及更高版本中对 QTableView 进行排序【英文标题】:How to sort QTableView in Qt4 and up 【发布时间】:2016-05-20 04:30:02 【问题描述】:代码创建一个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_()
【问题讨论】:
为什么不想使用代理模型? QSortFilterProxyModel 是要走的路。 我发现QSortFilterProxyModel
使事情变得相当复杂,因为它重新映射了 sourceModel 索引。跟踪数据变得很困难,尤其是在使用委托的情况下。
【参考方案1】:
我不是 python 开发人员,但您的模型中似乎没有实现 sort()
方法。
在 C++ 中,当您从 QAbstractItemModel
(或 QAbstractTableModel
)派生自定义模型时,您必须实现 QAbstractItemModel::sort()
方法才能启用排序。
【讨论】:
【参考方案2】:虽然@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_()
【讨论】:
【参考方案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_()
【讨论】:
这根本不排序以上是关于如何在 Qt4 及更高版本中对 QTableView 进行排序的主要内容,如果未能解决你的问题,请参考以下文章
如何在 android 2.3 及更高版本中获取当前启动器的包名?
在 Java 11 及更高版本中使用 HttpClient 时如何跟踪 HTTP 303 状态代码?