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

问题描述 投票:0回答:1

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

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

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

qt qsortfilterproxymodel
1个回答
2
投票

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

例如:

假设您收到当前项目更改的信号:

 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)

并且不要在该按钮槽上设置选择模型!这毫无意义。永远都是一样的。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.