Отключить сортировку дочерних элементов в QTreeView - PullRequest
1 голос
/ 27 января 2012

Я использую pyQt. Как можно отключить сортировку дочерних элементов в QTreeView / StandardItemModel?

Ответы [ 2 ]

4 голосов
/ 27 января 2012

Вы можете использовать QSortFilterProxyModel и переопределить его lessThan метод.

Либо создайте подкласс QStandardItem и переопределите его оператор меньше .

Вот простой пример, демонстрирующий последний подход:

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 голос
/ 27 января 2012

Вызовите setSortingEnabled(bool) в вашем экземпляре QTreeView. Здесь - соответствующий документ для c ++, а здесь - ссылка на pyqt api document для этой функции

...