【发布时间】:2012-02-20 05:07:45
【问题描述】:
我正在使用 pyQt。如何在 QTreeView/StandardItemModel 中禁用子项排序?
【问题讨论】:
标签: qt sorting pyqt pyqt4 qtreeview
我正在使用 pyQt。如何在 QTreeView/StandardItemModel 中禁用子项排序?
【问题讨论】:
标签: qt sorting pyqt pyqt4 qtreeview
您可以使用QSortFilterProxyModel 并重新实现其lessThan 方法。
或者,创建QStandardItem 的子类并重新实现其less than 运算符。
这是一个演示后一种方法的简单示例:
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_())
【讨论】:
QStandardItem 用于顶级项目,然后从__lt__ 返回False 用于所有子项目(因此不需要sortable 属性)。