crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Удаление выделенных элементов из модели
Анна
  опции профиля:
сообщение 27.7.2010, 16:46
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 276
Регистрация: 22.5.2008
Из: Зеленоград
Пользователь №: 181

Спасибо сказали: 30 раз(а)




Репутация:   4  


Получаю от вьювера

QItemSelectionModel *selection = ui.TableView->selectionModel();
QModelIndexList list = selection->selectedRows();  // список индексов выделенных элементов


Хотелось бы удалить выбранные элементы, но беда в том, что в list они стоят в том порядке, в каком выделялись во вьювере (задан режим MultySelection), что не позволяет удалять в цикле, т.к. удаление элемента с меньшим индексом делает другие индексы невалидными.
Может, кто знает, как по-быстрому и красиво решить эту проблему? Или нужно после каждого удаления перезапрашивать ui.TableView->selectionModel(); ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 27.7.2010, 18:27
Сообщение #2


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Для QModelIndex перегружен оператор меньше (<), т.ч. QModelIndexList можно отсортировать при помощи qSort. А затем уже удалять в цикле.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 28.7.2010, 5:50
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Анна, я использую такой код:
void ModelController::del()
{
    qDebug() << "ModelController::del()";
    emit beforeDelete();
    // Узнаем выделенную строку
    QItemSelectionModel    *sm = m_view->selectionModel();
    QModelIndexList indexes = sm->selectedIndexes();

    foreach(QModelIndex index, indexes){
        int row = index.row();
        if (!m_model->removeRows(row,1)){
            qDebug() << "\tERROR =" << m_model->lastError();
            break;
        }else{
            m_view->setRowHidden(row, true);
        }
    }
    setFase(MayFinish);
    emit deleted();
}
никогда не было проблем
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Анна
  опции профиля:
сообщение 28.7.2010, 8:23
Сообщение #4


Активный участник
***

Группа: Участник
Сообщений: 276
Регистрация: 22.5.2008
Из: Зеленоград
Пользователь №: 181

Спасибо сказали: 30 раз(а)




Репутация:   4  


Litkevich Yuriy, проблема возникает в том случае, когда в sm хранятся индексы, например, в такой последовательности 9, 1 , 5 (пусть это будут номера рядов). 9 удаляется без проблем, а вот, когда удаляется 1, на месте 5-го уже находится элемент, который стоял на 6-месте. Ну и дальше понятно, чо происходит.

Или дело в сигналах beforeDelete() и deleted()? Пока сигнал deleted() не пришёл, никаких подвижек в модели не происходит и все индексы истинны?

Вообще, у них что-то сказано про индексы, когда они истинны, а когда уже нет, но я это место как-то смутно поняла.

Сообщение отредактировал Анна - 28.7.2010, 8:28
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 28.7.2010, 8:37
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


вообще я использую модель QSqlTableModel и политику ManualSubmit, поэтому с индексами ничего не происходит. Т.к. данные не удаляются сразу и это не приводит к перестраиванию индексов.

Если у тебя не возможно реализовать такой вариант, то нужно из индексов получить постоянные индексы, и только потом начинать удаление.

Примерно так:
...
QModelIndexList indexes = sm->selectedIndexes();
QList<QPersistentModelIndex> persistents;
foreach(QModelIndex index, indexes){
    persistents << QPersistentModelIndex(index);
}

// вместо
// foreach(QModelIndex index, indexes){
// используй
foreach(QPersistentModelIndex index, persistents){
...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Анна
  опции профиля:
сообщение 28.7.2010, 10:00
Сообщение #6


Активный участник
***

Группа: Участник
Сообщений: 276
Регистрация: 22.5.2008
Из: Зеленоград
Пользователь №: 181

Спасибо сказали: 30 раз(а)




Репутация:   4  


С QPersistentModelIndex вроде бы получилось. Спасибо!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


8 чел. читают эту тему (гостей: 8, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 12.12.2024, 12:50