2013-06-18 15 views
1

我有一個模型,我將在其中動態添加符號。 我正在使用代理模型和選擇模型鏈接到視圖 每當我添加一個符號到我的源模型代理模型得到更新,但我爲視圖設置的選擇模型被搞砸了。 它不承認任何選擇 有人可以告訴我爲什麼?在qt中插入自定義模型後更新選擇模型和代理模型

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

我設置選擇模型,每次我點擊一個按鈕來處理選擇。

回答

1

我確定你試着用選擇模型給出的索引來訪問你的模型數據。但選擇模型將返回相對於您的視圖模型的索引。它是代理。所以,對模型的訪問數據,必須將其映射:

如:

考慮您對當前項目改變的信號:

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() .. 

但是,如果你accessig對數據的訪問是這樣的:

your_model->data(selected, role) 

您的訪問與代理指數模型,這將失敗。 你應該做的是這樣的:

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

mapToSource(...)

如果你用一QSelection工作,(如在的SelectionChanged(常量QItemSelection &選擇,常量QItemSelection &取消)信號)使用

mapSelectionToSource()

要做相反的路徑,請使用:

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

並且不要選擇模型設置該按鈕插槽!這個不成立。它將永遠是一樣的。