禁用QTreeView中子项的排序

时间:2012-01-27 05:43:06

标签: qt sorting pyqt pyqt4 qtreeview

我正在使用pyQt。如何在QTreeView / QStandardItemModel中禁用子项排序?

2 个答案:

答案 0 :(得分:4)

您可以使用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_())

答案 1 :(得分:1)

在QTreeView实例上调用setSortingEnabled(bool)Here是c ++的相应文档,here是此函数的pyqt api文档的链接