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

How to flag rows to be hidden in QAbstractItemModel-derived model

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

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

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

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

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

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

请分享您对执行此操作的最佳方式的看法。 谢谢

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

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

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

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

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