Russian Qt Forum

Qt => Model-View (MV) => Тема начата: burunduk от Январь 13, 2008, 00:27



Название: Странное использование QAbstractProxyModel
Отправлено: burunduk от Январь 13, 2008, 00:27
может кто знает что тут делается :)
в частности не очень ясно такое использование QAbstractProxyModel

метод из примера Qt treemodelcompleter:

Код:
void MainWindow::highlight(const QModelIndex &index)
{
    QAbstractItemModel *completionModel = completer->completionModel();
    QAbstractProxyModel *proxy = qobject_cast<QAbstractProxyModel *>(completionModel);
    if (!proxy)
        return;
    QModelIndex sourceIndex = proxy->mapToSource(index);
    treeView->selectionModel()->select(sourceIndex, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows);
    treeView->scrollTo(index);
}


Название: Re: Странное использование QAbstractProxyModel
Отправлено: Kainit от Январь 14, 2008, 11:33
Не поручусь за всех но мне непонятно в чём странность использования..

Есть обычная QAbstractItemModel, над ней возводится QAbstractProxyModel (например, для фильтрации данных и для сортировки), Разумеется, вьюв работает не с QAbstractProxyModel , а с QAbstractItemModel.

     proxyModel->setSourceModel(model);
     sourceView->setModel(model);

Именно поэтому мы пытаемся сначала сделать qobject_cast и если он не проходит, делаем
    if (!proxy)
        return;

затем нам нужно из проксёвого индекса получить индекс исходной модели
  QModelIndex sourceIndex = proxy->mapToSource(index);

и выделить соответствующий айтем во вьюхе
 treeView->selectionModel()->select(sourceIndex, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows);

мне кажется что всё вполне логично и оправданно, особенно если внимательно прочитать весь пример.




Название: Re: Странное использование QAbstractProxyModel
Отправлено: Emc от Январь 14, 2008, 12:45
тут дело немного в другом -- proxyModel как таковая не используется, а нужна лишь для получения индекса, который затем и выделяется в treeView.