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

Posted

技术标签:

【中文标题】如何在 QT 中实现自定义模型的 removeRow() 函数?【英文标题】:How to implement removeRow() function for customized model in QT? 【发布时间】:2016-03-24 04:02:48 【问题描述】:

我已经搜索了 QT 文档以供参考,但我有一些问题。 这是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中的索引与model中的数据不对应。 tableview 中的第一行可能是模型中的第三个数据。

如何通过tableview定位模型中的数据? removeRow() 函数有没有更好的实现方式?

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

作为官方文档says,

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

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

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

【讨论】:

以上是关于如何在 QT 中实现自定义模型的 removeRow() 函数?的主要内容,如果未能解决你的问题,请参考以下文章

在 TensorFlow 2.0 中实现自定义损失函数

如何在 ASP.NET MVC 5 中实现自定义身份验证

如何在Canvas中实现自定义路径动画

如何在Canvas中实现自定义路径动画

如何在黄瓜中实现自定义监听器?

如何在 TCPDF 中实现自定义字体