我正在尝试为我的树模型创建代理模型,但为了简单起见,我决定首先为小型表模型创建代理。表模型由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);
}