2016-03-24 53 views
0

我已經搜索過QT文檔供參考,但我有一些問題。 這裏是QT文檔的實現:如何在QT中爲自定義模型實現removeRow()函數?

bool TableModel::removeRows(int position, int rows, const QModelIndex &index) 
{ 
    Q_UNUSED(index); 
    beginRemoveRows(QModelIndex(), position, position + rows - 1); 

    for (int row = 0; row < rows; ++row) { 
     listOfPairs.removeAt(position); 
    } 

    endRemoveRows(); 
    return true; 
} 

我認爲它在tableview中使用index.row直接定位在模型中的數據。但是如果我爲tableview啓用排序呢?排序後,tableview中的索引不對應於模型中的數據。 tableview中的第一行可能是模型中的第三個數據。

如何通過tableview查找模型中的數據? 是否有更好的實現removeRow()函數?

回答

0

隨着官方文檔says

有接近排序模型/視圖結構的方法有兩種: 如果你的模型是排序,即如果它重新實現了化QAbstractItemModel ::排序()函數,QTableView和QTreeView都提供了一個API,允許您以編程方式對模型數據進行排序。 如果您的模型沒有所需的界面或者如果您想使用列表視圖來呈現您的數據,則替代方法是在呈現視圖中的數據之前使用代理模型來轉換模型的結構

因此,當您更改排序時會發生什麼情況取決於您如何爲模型安排排序:視圖中的排序會更改模型中行的排列方式,或者僅更改代理模型的排列方式。

如果使用代理模型,那麼可以在代理模型的行之間插入一些映射(視圖可以看到它們與當前的排序)以及原始模型的行。或者,您可以在原始模型的行中爲該行添加一些映射 - 實際上,甚至可以將void*嵌入到數據項中直接放入QModelIndex中,然後將模型重新實現爲QAbstractItemModel::createIndex,然後將指針該索引中的項目傳遞給諸如removeRow等方法。另一種可能是operate帶有一些項目的唯一整數標識符,而不是指向它的直接指針。因此,由您決定如何選擇行和實際模型項之間的映射方式。

相關問題