【问题标题】:How to implement removeRow() function for customized model in QT?如何在 QT 中实现自定义模型的 removeRow() 函数?
【发布时间】: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() 函数有没有更好的实现方式?

【问题讨论】:

    标签: c++ qt qt4 qt5


    【解决方案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 使用项目的一些唯一整数标识符而不是直接指向它的指针。因此,如何选择行与实际模型项之间的映射方式取决于您。

      【讨论】:

        猜你喜欢
        • 2021-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-16
        相关资源
        最近更新 更多