禁用 QTreeView 中子项的排序

发布于 2024-12-29 09:34:28 字数 58 浏览 7 评论 0原文

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

I am using pyQt. How can I disable child items sorting in QTreeView/StandardItemModel?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

花桑 2025-01-05 09:34:28

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

You could use a QSortFilterProxyModel and reimplement its lessThan method.

Alternatively, create a subclass of QStandardItem and reimplement its less than operator.

Here's a simple example that demonstrates the latter approach:

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_())
鱼窥荷 2025-01-05 09:34:28

在 QTreeView 实例上调用 setSortingEnabled(bool) 。 这里是c++和这里是链接到此函数的 pyqt api 文档

Call setSortingEnabled(bool) on your QTreeView instance. Here is the corresponding docu for c++ and here is the link to pyqt api docu for this function

美胚控场 2025-01-05 09:34:28

如果您希望使用 SortFilterProxyModel,这也适用。

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

    def lessThan(self, left: QtCore.QModelIndex, right: QtCore.QModelIndex) -> bool:
        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)

This works as well if you wish to use a SortFilterProxyModel.

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

    def lessThan(self, left: QtCore.QModelIndex, right: QtCore.QModelIndex) -> bool:
        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)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文