如何标记要在QAbstractItemModel派生的模型中隐藏的行

问题描述 投票:0回答:1

我正在实现一个基于Qt的树视图,其中视图是基于QTreeView的类,模型是基于QAbstractItemModel的类。树应该有数百万个节点。我正在实现一种过滤机制,其中过滤出的节点只是隐藏在树视图中。 (我不想使用QSortFilterProxyModel

模型的内部数据结构看起来有点像这样。

class MyTreeItem
{
 ...
 private:
      QList<MyTreeItem *> _children;
      bool                _isHidden;
 };

 class MyTreeModel : public QAbstractItemModel 
 {
  ...
  private:
       MyTreeItem * _rootNode;
  };

我可以确定在填充模型数据结构时是否应该过滤特定节点(MyTreeItem *)。因此,我想让QTreeView知道在填充数据结构时应隐藏此项,而不是再次遍历整个树并在填充后隐藏行。

老实说,我正处于设计阶段,所以我没有任何真正的代码。我的要求是,在填充数据结构时,我将确定是否应该过滤当前节点,如果是,则将设置标志_isHidden。但我不知道如何通过调用QTreeView::setRowHidden()或其他方式让视图知道何时隐藏行。

请分享您对最佳方式的看法。谢谢。

qt qtreeview qabstractitemmodel model-view
1个回答
0
投票

没有built-in data flags来隐藏标准Qt模型项视图中的单元格(或行)。您可以禁用项目或使其不可选,但不能完全隐藏它们。

您当然可以循环遍历您的模型并手动调用QTreeView::setRowHidden(),但您表明您不想这样做,我倾向于同意(使用代理模型会更加高效和实用)。

因此,您很可能希望子类化其中一个项目视图以获得所需的效果,并根据您的自定义标志在那里过滤它们。还有item delegate路线(也设置在视图级别,而不是模型),因此您可以通过简单地不绘制它们来过滤掉那里的字段(但我从未尝试过)。

或者如评论中所建议的那样使用QSortFilterProxyModel,它专为您所要求的设计而设计(并且实际上不会给现代硬件上的典型GUI应用程序增加明显的开销)。您也可以编写自己的代理模型。例如,您只能使用所需的QSortFilterProxyModel code部分。

或者正如我已经建议的那样,只需在构建模型时不包含您不想要的行。

© www.soinside.com 2019 - 2024. All rights reserved.