禁用 QTreeView 中子项的排序

问题描述 投票:0回答:3

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

qt sorting pyqt pyqt4 qtreeview
3个回答
4
投票

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

0
投票

在 QTreeView 实例上调用

setSortingEnabled(bool)
这里是c++的相应文档,这里是该函数的pyqt api文档的链接


0
投票

如果您想使用 SortFilterProxyModel,这也适用。

class SortingProxyModel(QtCore.QSortFilterProxyModel):
    def __init__(self, parent=None):
        super().__init__(parent)

    def lessThan(self, left, right):
        if self.sourceModel().data(left) is None:
            return

        if left.parent().row() != -1:
            return

        left_display = self.sourceModel().data(left, QtCore.Qt.DisplayRole)
        right_display = self.sourceModel().data(right, QtCore.Qt.DisplayRole)
        return left_display < right_display

model = QtGui.QStandardItemModel()
proxy_model = SortingProxyModel()
proxy_model.dynamicSortFilter()
proxy_model.setSourceModel(model)
QTreeView.setModel(proxy_model)
© www.soinside.com 2019 - 2024. All rights reserved.