禁用QTreeView中子项的排序

问题描述:

我正在使用pyQt。如何禁用QTreeView/StandardItemModel中的子项排序?禁用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_()) 
+0

so,key - 如果item不可排序(如果item在我的情况下不是*项目),则返回__lt__ compassion上的False? – 2012-01-27 21:19:29

+1

@Andrewshkovskii。是。在你的情况下,它看起来像你可以使用普通的'QStandardItem'作为顶层项目,然后从'__lt__'中为所有子项目返回'False'(因此不需要'sortable'属性)。 – ekhumoro 2012-01-27 21:42:23

+0

谢谢,我会尽力:) – 2012-01-28 07:40:32

在您的QTreeView实例上调用setSortingEnabled(bool)Here是对C对应的实况++和here是链接到PyQt的API实况此功能

+1

我不需要禁用排序的所有项目,只为孩子的物品; – 2012-01-27 06:27:09