QT开发中文网

C++正确使用QSortFilterProxyModel获取过滤qtableview数据后,双击修改时过滤数据时,显示的是源模型的当前行数据

问题描述

在使用 QSortFilterProxyModel 过滤 QTableView 数据的过程中,双击修改时过滤数据时,显示的是源模型的当前行数据而不是过滤后的数据。

问题原因

在 QTableView 中双击后触发的编辑操作会通过 QModelIndex 指向对应的 QAbstractItemModel 的单元格数据。而在使用 QSortFilterProxyModel 进行数据过滤后,QModelIndex 会指向过滤后的数据,而非原始数据。但是在默认情况下,QItemDelegate 中的 createEditor 函数会接收原始的 QModelIndex,导致在编辑操作时显示的是源模型的当前行数据。

解决方法

为了正确地获取到过滤后的数据,我们可以将 QSortFilterProxyModel 的 mapToSource 函数用于将过滤后的 QModelIndex 转换为源模型的 QModelIndex。这样在 QItemDelegate 中的 createEditor 函数中,我们就可以正确地获取到过滤后的数据。

示例代码:

QModelIndex MyDelegate::mapIndex(const QModelIndex &proxyIndex) const
{
    if (proxyIndex.isValid()) {
        return m_proxyModel->mapToSource(proxyIndex);
    }
    return QModelIndex();
}

QWidget *MyDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &proxyIndex) const
{
    QModelIndex sourceIndex = mapIndex(proxyIndex);
    if (!sourceIndex.isValid()) {
        return nullptr;
    }
    // TODO: create editor widget
}

在创建 QItemDelegate 时,我们可以将 QSortFilterProxyModel 作为参数传入,并通过 mapIndex 函数将过滤后的 QModelIndex 转换为源模型的 QModelIndex。在 createEditor 函数中,我们就可以正确地获取到过滤后的数据了。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://qt.0voice.com/?id=1015

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?