禁用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_())
so,key - 如果item不可排序(如果item在我的情况下不是*项目),则返回__lt__ compassion上的False? – 2012-01-27 21:19:29
@Andrewshkovskii。是。在你的情况下,它看起来像你可以使用普通的'QStandardItem'作为顶层项目,然后从'__lt__'中为所有子项目返回'False'(因此不需要'sortable'属性)。 – ekhumoro 2012-01-27 21:42:23
谢谢,我会尽力:) – 2012-01-28 07:40:32