问题描述
在使用 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 函数中,我们就可以正确地获取到过滤后的数据了。