2012-01-27 19 views

答えて

4

です。

または、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

だから、もし项目がソート可能でないならば、__lt__思いやりの上でキーを返すFalse(私の場合はトップレベルの項目ではない)? –

+1

@ Andrewshkovskii。はい。あなたのケースでは、トップレベルの項目に対して通常の 'QStandardItem'を使用し、すべての子項目に対して' __lt__'から 'False'を返すように見えます(' sortable'属性は不要です)。 – ekhumoro

+0

ありがとう、私は試してみる:) –

1

QTreeViewインスタンスのsetSortingEnabled(bool)を呼び出します。 Hereは、cのための対応ドキュメンタリーで++とhereはあなたがQSortFilterProxyModelを使用し、そのlessThanメソッドを再実装でき、この機能のためのPyQtはAPIのドキュメンタリーへのリンク

+1

は、私が唯一の子項目のために、すべての項目の並べ替えを無効にする必要はありません。 –

関連する問題