我正在使用 pyQt。如何禁用 QTreeView/StandardItemModel 中的子项排序?
您可以使用 QSortFilterProxyModel 并重新实现其 lessThan 方法。
或者,创建 QStandardItem 的子类并重新实现其 小于 运算符。
这是一个演示后一种方法的简单示例:
from random import sample
from PyQt4 import QtGui, QtCore
class Window(QtGui.QWidget):
def __init__(self):
QtGui.QWidget.__init__(self)
self.view = QtGui.QTreeView(self)
self.view.setHeaderHidden(True)
self.model = QtGui.QStandardItemModel(self.view)
self.view.setModel(self.model)
parent = self.model.invisibleRootItem()
keys = range(65, 91)
for key in sample(keys, 10):
item = StandardItem('Item %s' % chr(key), False)
parent.appendRow(item)
for key in sample(keys, 10):
item.appendRow(StandardItem('Child %s' % chr(key)))
self.view.sortByColumn(0, QtCore.Qt.AscendingOrder)
layout = QtGui.QVBoxLayout(self)
layout.addWidget(self.view)
class StandardItem(QtGui.QStandardItem):
def __init__(self, text, sortable=True):
QtGui.QStandardItem.__init__(self, text)
self.sortable = sortable
def __lt__(self, other):
if getattr(self.parent(), 'sortable', True):
return QtGui.QStandardItem.__lt__(self, other)
return False
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
如果您想使用 SortFilterProxyModel,这也适用。
class SortingProxyModel(QtCore.QSortFilterProxyModel):
def __init__(self, parent=None):
super().__init__(parent)
def lessThan(self, left, right):
if self.sourceModel().data(left) is None:
return
if left.parent().row() != -1:
return
left_display = self.sourceModel().data(left, QtCore.Qt.DisplayRole)
right_display = self.sourceModel().data(right, QtCore.Qt.DisplayRole)
return left_display < right_display
model = QtGui.QStandardItemModel()
proxy_model = SortingProxyModel()
proxy_model.dynamicSortFilter()
proxy_model.setSourceModel(model)
QTreeView.setModel(proxy_model)