Russian Qt Forum
Ноябрь 22, 2024, 22:59 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Select в QTreeView после layoutChanged  (Прочитано 2779 раз)
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'ов, то всё работает!
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #1 : Апрель 04, 2015, 01:26 »

Надо обновлять персистент индексы. См методы QAIM::persistentIndexList и QAIM::changePersistentIndexList
Записан
TigerProg
Гость
« Ответ #2 : Апрель 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;
}

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

Какие именно индексы и в какой момент нужно обновлять?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.112 секунд. Запросов: 22.