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

sus*_*iss 5 qt qtreeview qabstractitemmodel model-view

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

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

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

 class MyTreeModel : public QAbstractItemModel 
 {
  ...
  private:
       MyTreeItem * _rootNode;
  };
Run Code Online (Sandbox Code Playgroud)

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

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

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

Max*_*rno 6

在标准 Qt 模型项视图中没有内置数据标志来隐藏单元格(或行)。您可以禁用项目或使不可选择,但不能完全隐藏它们。

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

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

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

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