我正在实现基于QT的树视图,其中视图是基于QTREEVIEW的类,模型是基于QABSTRACTITEMMODEMMODEMMODEL的类。这棵树应该有数百万个节点。我正在实现一种过滤机制,其中过滤的节点只是隐藏在树视图中。(我不想使用QSortFilterProxyModel
)
模型的内部数据结构看起来有些类似。
class MyTreeItem
{
...
private:
QList<MyTreeItem *> _children;
bool _isHidden;
};
class MyTreeModel : public QAbstractItemModel
{
...
private:
MyTreeItem * _rootNode;
};
i可以确定在填充模型数据结构时是否应过滤特定的节点(mytreeitem*)。因此,我想让qtreeview知道该项目在填充数据结构时应该被隐藏,而不是在填充后再次穿越整个树并隐藏行。
老实说,我处于设计阶段,所以我没有任何真正的代码。我的要求是,在填充数据结构时,我将确定是否应过滤当前节点,如果是,则将设置标志_isHidden
。但是我不确定如何通过调用QTreeView::setRowHidden()
或其他某些方式来隐藏该行。
请分享您对最佳方式的想法。谢谢。
在标准QT模型项目视图中没有内置数据标志来隐藏单元格(或行)。您可以禁用物品或制作不可选择的物品,但不能完全隐藏它们。
您当然可以循环循环模型,并手动致电QTreeView::setRowHidden()
,但您表示您不想这样做,我倾向于同意(使用代理模型会更有效,更有效)。<<<<<<<<<<<<<<
因此,您很可能希望将其中一个项目视图子类取出,以获取所需的效果并根据您的自定义标志过滤它们。还有项目委托路由(也设置为视图级别,而不是模型),因此您可以通过简单地不绘画来过滤到那里的字段(但我从未尝试过)。
或按照注释中建议的使用QSortFilterProxyModel
,它是为您要问的完全设计的(并且实际上不会在现代硬件上的典型GUI应用程序中添加明显的开销)。您也可以编写自己的代理模型。您只能使用所需的QSortFilterProxyModel
代码的部分。
或正如我也已经建议的那样,根本不包括构建模型时不需要的行。