带有多个标头的QStandardItemModel - 将QTreeView标头与模型分离

时间:2018-04-19 17:08:57

标签: python pyside qstandarditemmodel qheaderview

我有一个QStandardItemModel,在不同的视图中需要不同的水平标题标签。

我无法找到有关如何以这种方式将QTreeView的标头与模型分离的信息。这可能吗?

请参阅下面的简单代码示例。

在这个例子中 - 我们有ItemTypeA,它是我们的顶级项目,它的横轴表示属性" Name | Interpolaton |正常化&#34 ;.

ItemTypeA(ItemTypeB)的子项在横轴上包含表示" Name |的项目乘"

TreeViewA显示所有内容,TreeViewB仅显示所选顶级项目的子项(此示例中未实现选择连接)。

{{ dateForSomething | date('theFormatIWant', false) }}

思想?

1 个答案:

答案 0 :(得分:2)

这些情况的解决方案是使用QIdentityProxyModel,但PySide和PySide中不存在此类,因此我们必须使用类似的类,如QSortFilterProxyModel,并覆盖headerData方法。

...

class HeaderProxyModel(QSortFilterProxyModel):
    def __init__(self, *args, **kwargs):
        QSortFilterProxyModel.__init__(self, *args, **kwargs)
        self.labels = []
    def setHeaderLabels(self, labels):
        self.labels = labels
    def headerData(self, section,orientation, role = Qt.DisplayRole):
        if orientation == Qt.Horizontal and 0 <= section < self.columnCount() and role==Qt.DisplayRole and section < len(self.labels) :
            return self.labels[section]
        return QSortFilterProxyModel.headerData(self, section, orientation, role)

class TreeViewB(QTreeView):
    '''
    THIS VIEW Needs the Headers:
        Item Name | Multiply
    '''
    def __init__(self, sourceView):
        super(TreeViewB, self).__init__()
        model = sourceView.model()
        proxy = HeaderProxyModel()
        proxy.setSourceModel(model)
        proxy.setHeaderLabels(["Name", "Multiply"])
        self.setModel(proxy)
        self.setRootIndex(proxy.index(0,0))
...    

enter image description here