QPersistentModelIndex更新错误

时间:2017-06-14 11:26:16

标签: c++ qt model-view

我正在尝试为我的树模型创建代理模型,但为了简单起见,我决定首先为小型表模型创建代理。表模型由1列和几行组成;存储在QStringList中的数据。

代理模型在一对列表中存储源索引到代理索引的映射,反之亦然(我后来在代理中使用树模型,用哈希表替换列表):

QList<QPersistentModelIndex> m_sourceToProxyMap;
QList<QPersistentModelIndex> m_proxyToSourceMap;

我重新实现了代理的setSourceModel()方法来填充代理映射,如下所示:

QAbstractProxyModel::setSourceModel(sourceModel);
for (int i = 0; i < sourceModel->rowCount({}); ++i) {
    auto sourceIndex = sourceModel->index(i, 0, {});
    auto proxyIndex = createIndex(i, 0, sourceIndex.internalPointer());
    m_sourceToProxyMap.append(proxyIndex);
    m_proxyToSourceMap.append(sourceIndex);
}

填充代理模型后,映射包含以下索引(我认为它的结果是正确的):

QModelIndex(0,0,0x0,ProxyTableModel(0x1e92930)) QModelIndex(0,0,0x0,TableModel(0x1feacf0))
QModelIndex(1,0,0x0,ProxyTableModel(0x1e92930)) QModelIndex(1,0,0x0,TableModel(0x1feacf0))

在第1行的源模型中插入一行后,代理模型的更改行的索引错误:

QModelIndex(0,0,0x0,ProxyTableModel(0x1741e40)) QModelIndex(0,0,0x0,TableModel(0x19411b0))
QModelIndex(2,0,0x0,ProxyTableModel(0x1741e40)) QModelIndex(1,0,0x0,TableModel(0x19411b0))
QModelIndex(2,0,0x0,ProxyTableModel(0x1741e40)) QModelIndex(2,0,0x0,TableModel(0x19411b0))

这是代理&#39;连接到源模型rowsInserted()信号的插槽:

void ProxyTableModel::onSourceRowsInserted(const QModelIndex& sourceParent, int first, int last)
{
    beginInsertRows({}, first, last);
    auto sourceIndex = sourceModel()->index(first, 0, sourceParent);
    auto proxyIndex = createIndex(first, 0, sourceIndex.internalPointer());
    m_sourceToProxyMap.insert(first, proxyIndex);
    m_proxyToSourceMap.insert(first, sourceIndex);
    endInsertRows();
}

如何解决这个问题? (无需在每次插入时从头开始完全填充代理模型)

更新:我想我得到了一些东西。在创建新的持久性索引并将其插入映射后,endInsertRows()方法更新了索引(包括新索引),因此临时解决方法是移动方法,如下所示:

oid ProxyTableModel::onSourceRowsInserted(const QModelIndex& sourceParent, int first, int last)
{
    beginInsertRows({}, first, last);
    endInsertRows();
    auto sourceIndex = sourceModel()->index(first, 0, sourceParent);
    auto proxyIndex = createIndex(first, 0, sourceIndex.internalPointer());
    m_sourceToProxyMap.insert(first, proxyIndex);
    m_proxyToSourceMap.insert(first, sourceIndex);
}

0 个答案:

没有答案