PyQt QSortProxyModel-是否需要显示一列才能进行排序?

时间:2018-11-02 22:35:28

标签: python pyqt

我正在尝试制作一个树形视图,其中底层节点具有许多属性(〜9),并且一直在研究示例附带的PyQt5示例。但是,示例和搜索结果无法回答我的以下问题。首先是我的目标:

我只是想通过一列节点名在树上给出一个视图,并希望能够对不同的属性/列进行排序。我尝试使用

        myView.sortByColumn(8, QtCore.Qt.AscendingOrder)

按模型的第8个属性排序

def data(self, index, role):
[...]
        elif index.column() == 8:

            return node.status
[...]

但是仅在视图中显示第一列(节点名称)

def columnCount(self, parent):
    """
    in: QModelIndex
    out: int
    """
    N = 1

    return N

在我看来没有看到排序结果。

将columnCount更改为9后,该视图按第8列排序,以换取我不想在视图中看到的8列...

是否必须显示一列才能对其进行排序?如果没有,您能给出一个解释或小例子吗?

1 个答案:

答案 0 :(得分:0)

我在尝试了一些东西后才解决了这个问题:

事实证明,您必须确保模型的columnCount N足够大。代理模型可以使用列j进行排序!即N> j。

然后,可以使用自定义(!)代理模型的columnCount来显示所需的列数。

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

    def columnCount(self, parent=None):
        return 1

class MyTreeModel(QtCore.QAbstractItemModel):

    def __init__(self, root, parent=None):
        """
        in: Node, Qobject
        """

        super(MyTreeModel, self).__init__(parent)

        self._root = root
        self.parent = parent


    def columnCount(self, parent):
        """
        in: QModelIndex
        out: int
        """
        return 9

        [...]

一旦您记住代理模型“查看”该模型(即仅知道该模型公开的列),这种偏离当然就有意义了。

希望这可以为其他人节省几分钟的尝试和错误。