【问题标题】:How to show only part of model in QTreeView?如何在 QTreeView 中仅显示模型的一部分?
【发布时间】:2021-05-26 12:12:40
【问题描述】:

我一直在玩this 代码,但我不明白如何调整模型列的可见性。

for i in range(3):
    parent1 = QStandardItem('Family {}. Some long status text for sp'.format(i))
    for j in range(3):
        child1 = QStandardItem('Child {}'.format(i*3+j))
        child2 = QStandardItem('row: {}, col: {}'.format(i, j+1))
        child3 = QStandardItem('row: {}, col: {}'.format(i, j+2))
        parent1.appendRow([child1, child2, child3])
    model.appendRow(parent1)
    # span container columns
    view.setFirstColumnSpanned(i, view.rootIndex(), True)

我想要一个模型有很多字段和几个视图,每个视图只显示特定的列。 我不想用setColumnHidden 隐藏列,因为当模型扩展时,我将不得不隐藏新列。

我熟悉 Gtk,它很简单:创建一个 TreeView,手动添加列,用渲染器填充它们并告诉每个渲染器,它应该从模型中的哪一列获取数据。 Qt可以吗?

【问题讨论】:

  • 您可以使用 QSortFilterProxyModel 过滤您想要隐藏的数据
  • @Fabio 谢谢。我必须继承QSortFilterProxyModel 并调用filterAcceptsColumn 还是我错过了什么?

标签: qt pyqt qtreeview


【解决方案1】:

您可以使用 QSortFilterProxyModel:

class FilterColumnModel(QSortFilterProxyModel):
    def __init__(self, parent=None):
        super(FilterColumnModel, self).__init__(parent)
        self._columns = None

    @property
    def columns(self):
        return self._columns

    @columns.setter
    def columns(self, columns):
        self._columns = columns[:]
        self.invalidateFilter()

    def filterAcceptsColumn(self, source_column, source_parent):
        if self.columns is None:
            return True
        return source_column in self.columns
filter_model = FilterColumnModel()
filter_model.setSourceModel(model)
filter_model.columns = [0, 2]
view.setModel(filter_model)
view.setUniformRowHeights(True)

【讨论】:

  • 像魅力一样工作。谢谢!
猜你喜欢
  • 2018-06-22
  • 1970-01-01
  • 2020-04-06
  • 1970-01-01
  • 1970-01-01
  • 2018-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多