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

How to implement removeRow() function for customized model in QT?

本文关键字:removeRow 实现 函数 模型 自定义 QT      更新时间:2023-10-16

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

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;
}

我认为它使用表视图中的index.row来直接定位模型中的数据。但是,如果我为表视图启用排序,该怎么办?排序后,表视图中的索引与模型中的数据不对应。表视图中的第一行可以是模型中的第三数据。

如何通过表视图定位模型中的数据?removeRow()函数还有更好的实现吗?

您可以使用tableWidgetItem->setData(0,Qt::UserRole,"Desired Identity");即使对行进行排序,它也将始终是唯一的。参考QTableWidget通过用户数据查找一行

正如官方文件所说,

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

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

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