如何标记要隐藏在 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 中您需要的部分。
或者正如我已经建议的那样,在构建模型时不要包含不需要的行。
我正在实现基于 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 中您需要的部分。
或者正如我已经建议的那样,在构建模型时不要包含不需要的行。