在qt中插入自定义模型后更新选择模型和代理模型

时间:2013-06-18 12:36:20

标签: qt

我有一个模型,我将动态添加符号。 我正在使用代理模型和选择模型来链接视图 每当我向源模型添加符号时,代理模型都会更新,但我为视图设置的选择模型会搞砸。 它不再识别任何选择 谁能告诉我为什么?

void SymbolViewer::on_openButton_clicked()
{
    this->selModel = ui->symbolListView->selectionModel();
     ...
}

每次我点击一个按钮来处理选择时,我都会设置选择模型。

1 个答案:

答案 0 :(得分:1)

我确定您尝试使用选择模型提供的索引来访问模型数据。但是选择模型将返回相对于视图模型的索引。它是代理人。因此,要访问模型的数据,您必须映射它:

e.g:

考虑您有关于当前项目更改的信号:

 connect( p_selectionModel,
    SIGNAL( currentChanged(const QModelIndex &, const QModelIndex &)),
    this,
    SLOT(viewCurrentChanged(const QModelIndex &, const QModelIndex &)));

在你的插槽中:

viewCurrentChanged(const QItemSelection & selected, const QItemSelection & deselected)

选中将是您的代理的QModelIndex。您可以通过

访问数据
selected.data() ..

但如果你的访问方式如此:

your_model->data( selected, role )

您使用代理索引访问模型时会失败。 你应该这样做:

your_model->data( proxy_model->mapToSource(selected) , role )

mapToSource(...)

如果您使用QSelection,(如在selectionChanged(const QItemSelection& selected,const QItemSelection& deselected)信号中)使用

mapSelectionToSource()

要执行反向路径,请使用:

QItemSelection QAbstractProxyModel::mapFromSource(const QModelIndex & sourceIndex) const QItemSelection QAbstractProxyModel::mapSelectionFromSource(const QItemSelection & sourceSelection)

并且不要在该按钮插槽上设置选择模型!这没有道理。它将永远是相同的。