Russian Qt Forum

Qt => Model-View (MV) => Тема начата: TigerProg от Апрель 02, 2015, 23:06



Название: Select в QTreeView после layoutChanged
Отправлено: TigerProg от Апрель 02, 2015, 23:06
Всем привет!

Есть моя модель(на основе QAbstractItemModel) и стандартная QSortFilterProxyModel на которую настроено дерево. Сортировка осуществляется по столбцу sortOrder из модели.
Код:
myModel = new MyModel(this);
proxyModel = new QSortFilterProxyModel;
proxyModel->setDynamicSortFilter(true);
proxyModel->setSourceModel(myModel);
ui.treeView->setModel(proxyModel);
ui.treeView->sortByColumn(2,Qt::AscendingOrder);

Нужно поднять одну строку в дереве выше (поменять sortOrder местами у двух строк).
Код:
void Widget::on_btnUp_clicked()
{
    myModel->moveUp(proxyModel->mapToSource(ui.treeView->currentIndex()));
}


После этого куда-то пропадает выделение в дереве, как его вернуть?

Код в модели метода подъёма:
Код:
bool MyModel::moveUp( const QModelIndex& index )
{
    Item* item = itemFromIndex(index);
    Item* parentItem = item->parentItem();
    Item* prevItem = parentItem->itemBySortOrder(item->sortOrder()-1);
    Q_ASSERT(prevItem);
    emit layoutAboutToBeChanged();
    // меняем местами
    parentItem ->swapItems(prevItem, item);
    emit layoutChanged();
    return true;
}

Прикрепил к посту всё тестовое приложение.

Для того, чтобы понять мою проблему, нужно встать на любой item без child'ов в середине списка и нажать up - item'ы поменяются местами, но выделение пропадёт. Причём если item имеет child'ов, то всё работает!


Название: Re: Select в QTreeView после layoutChanged
Отправлено: Авварон от Апрель 04, 2015, 01:26
Надо обновлять персистент индексы. См методы QAIM::persistentIndexList и QAIM::changePersistentIndexList


Название: Re: Select в QTreeView после layoutChanged
Отправлено: TigerProg от Апрель 04, 2015, 03:05
Спасибо за ответ!
Я пробовал вызывать changePersistentIndex для индексов объектов меняемых местами вот тут
Код:
bool MyModel::moveUp( const QModelIndex& index )
{
    Item* item = itemFromIndex(index);
    Item* parentItem = item->parentItem();
    Item* prevItem = parentItem->itemBySortOrder(item->sortOrder()-1);
    Q_ASSERT(prevItem);
    emit layoutAboutToBeChanged();
    // меняем местами
    parentItem ->swapItems(prevItem, item);

    //ТУТ changePersistentIndex для индексов соответствующих prevItem и item

    emit layoutChanged();
    return true;
}

Но ничего не получилось(

Какие именно индексы и в какой момент нужно обновлять?