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 に答える