如何在QT中为自定义模型实现removeRow()函数?

时间:2016-03-24 04:02:49

标签: c++ qt qt4 qt5

我搜索过QT doc以供参考,但我收到了一些问题。 以下是QT doc中的实现:

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()函数实现吗?

2 个答案:

答案 0 :(得分:0)

你可以使用tableWidgetItem-&gt; setData(0,Qt :: UserRole,&#34; Desired Identity&#34;); 即使您对行进行排序,它也将始终是唯一的。参考 QTableWidget find a row through userdata

答案 1 :(得分:0)

作为官方文档says

  

在模型/视图架构中有两种方法可以进行排序:   如果您的模型是可排序的,即,如果它重新实现了QAbstractItemModel :: sort()函数,QTableView和QTreeView都提供了一个API,允许您以编程方式对模型数据进行排序。   如果您的模型没有所需的接口,或者您想使用列表视图来显示数据,那么替代方法是在视图中显示数据之前使用代理模型转换模型的结构

因此,更改排序时会发生什么取决于您为模型排序的方式:在视图中排序会更改模型中行的排列,或者只更改代理模型的排列。

如果您使用代理模型,则可以在代理模型的行之间插入一些映射(当视图使用当前排序查看它们时)和原始模型的行。或者您可以在原始模型中的行和实际数据项之间添加一些映射 - 事实上,您甚至可以将void*直接嵌入到模型中的QModelIndex数据项中&# 39;重新实现QAbstractItemModel::createIndex,然后从传递给removeRow等方法的索引中检索指向该项的指针。另一种可能性是operate具有项的唯一整数标识符,而不是指向它的直接指针。因此,您可以选择在行和实际模型项之间进行映射的方式。