我正在尝试制作一个树形视图,其中底层节点具有许多属性(〜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列...
是否必须显示一列才能对其进行排序?如果没有,您能给出一个解释或小例子吗?
答案 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
[...]
一旦您记住代理模型“查看”该模型(即仅知道该模型公开的列),这种偏离当然就有意义了。
希望这可以为其他人节省几分钟的尝试和错误。