QTreeView 的两个嵌套代理模型和段错误

Posted

技术标签:

【中文标题】QTreeView 的两个嵌套代理模型和段错误【英文标题】:Two nested proxy models and segfault for QTreeView 【发布时间】:2012-08-14 11:21:27 【问题描述】:

我正在使用 QTreeView 和两个基于 QSortFilterProxyModel 的过滤器。

我需要获取 QTreeView 中当前显示项目的列表,所以我采用选定的索引(通过 ->selectionModel()->selectedIndexes()),将它们传递给简单的递归函数,但总是得到 SIGSEGV。在调试时,我发现调用堆栈结束的地方——它在 QVector::fill 中的某个地方。

也许我做错了什么?如果我通过 mapToSource() 传递索引,我会得到所有项目,而不仅仅是显示的项目。

迭代器函数很简单:

void CollectionTreeWidget::iterator(const QModelIndex & index, QModelIndexList & items)

    int count = p->dateFilterProxy->rowCount(index);
    for (int i=0; i<count; i++) 
        QModelIndex t = index.child(i, 0);
        iterator(t, items);
    

这里的dateFilterProxy 是一个用作QTreeView 模型的模型。代码在rowCount 调用时崩溃。

【问题讨论】:

有什么办法pdateFilterProxy 会变得陈旧吗? 不,它们在整个应用程序运行时都是一样的。 【参考方案1】:

我想我在上面的算法中发现了错误,为了消除段错误,我们不能计算索引叶子的子索引(即没有子节点的节点)。

【讨论】:

所以,最后,你在使用过滤代理时应该非常准确,因为如果你不这样做,你会得到意想不到的段错误。

以上是关于QTreeView 的两个嵌套代理模型和段错误的主要内容,如果未能解决你的问题,请参考以下文章

QTreeView 和 QTableView 的 Qt 模型

Qt入门系列开发教程高级控件篇QTreeView树形视图

QTreeView,每个级别的样式不同

在 QTreeView 中使用自定义角色而不是 DisplayRole

在QTreeView中拖放,removeRows没有被调用

QTreeView - 排序和过滤模型