2016-03-24 48 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带有一些项目的唯一整数标识符,而不是指向它的直接指针。因此,由您决定如何选择行和实际模型项之间的映射方式。

相关问题