gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:21:36 24 4
gpt4 key购买 nike

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

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

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

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

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

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

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

最佳答案

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

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

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

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

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

关于qt - 如何标记要隐藏在 QAbstractItemModel 派生模型中的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47918894/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com