1

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

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

每次单击按钮进行选择时,我都会设置选择模型。

4

1 回答 1

1

我确定您正在尝试使用选择模型给出的索引访问您的模型数据。但是选择模型将返回相对于您的视图模型的索引。它是代理。因此,要访问模型的数据,您必须对其进行映射:

例如:

考虑您对当前项目更改有一个信号:

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

在您的插槽上:

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

selected 将是您代理的 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)

并且不要在那个按钮槽上设置选择模型!这没有道理。它总是一样的。

于 2013-06-18T15:02:09.393 回答