2012-08-14 67 views
1

我正在使用QTreeView和兩個基於QSortFilterProxyModel的過濾器。我需要獲取QTreeView中當前顯示的項目列表,所以我選擇了索引(通過 - > selectionModel() - > selectedIndexes()),將它們傳遞到簡單的遞歸函數,但總是得到SIGSEGV。在調試中,我發現調用棧結束的地方 - 它在QVector :: fill中的某處。QTreeView的兩個嵌套代理模型和段錯誤

也許我做錯了什麼?如果我通過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調用。

+0

有沒有任何方式'p'或'dateFilterProxy'可能會變成陳舊? – cmannett85 2012-08-14 12:40:01

+0

不,它們在整個應用程序運行時都是一樣的。 – 2012-08-14 16:04:43

回答

1

我想我在上面的算法中發現錯誤,爲了消除段錯誤,我們不能爲索引葉子(即沒有子元素的節點)計算子索引。

+0

所以,最後,當使用過濾器代理時,你會非常準確,因爲如果你不這樣做,你會得到意想不到的錯誤。 – 2012-08-15 06:10:42