【问题标题】:Disable sorting of child items in QTreeView禁用 QTreeView 中子项的排序
【发布时间】:2012-02-20 05:07:45
【问题描述】:

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

【问题讨论】:

    标签: qt sorting pyqt pyqt4 qtreeview


    【解决方案1】:

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

    【讨论】:

    • 所以,关键 - 如果项目不可排序(如果项目在我的情况下不是顶级项目),则在 lt 同情上返回 False?
    • @Andrewshkovskii。是的。在您的情况下,您似乎可以将普通的QStandardItem 用于顶级项目,然后从__lt__ 返回False 用于所有子项目(因此不需要sortable 属性)。
    【解决方案2】:

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

    【讨论】:

    • 我不需要对所有项目禁用排序,仅对子项目禁用;
    猜你喜欢
    • 1970-01-01
    • 2013-07-01
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 2018-03-28
    • 1970-01-01
    • 1970-01-01
    • 2014-05-11
    相关资源
    最近更新 更多