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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО]И снова QTableView  (Прочитано 6324 раз)
Larry
Гость
« : Февраль 05, 2016, 18:08 »

Добрый день.
Снова возникла проблема с QTableView, вернее с моделью...
Переделал хранилище данных с vector на map и теперь постоянно при удалении исключение. В методе модели data вызывается индекс 0, хотя его уже нет...Почему так происходит?
хранилище это map<int, QData> (QData это класс в котором хранится вектор со строками).

Вот так удаляю:
Код:
void TableView::removeRow(const QModelIndex &index)
{
    beginRemoveRows(index, index.row(), index.row());
        m_rows.erase(index.row());
        qDebug() << "remove";
    endRemoveRows();
    emit layoutChanged();
}

а вот data:
Код:
QVariant TableView::data(const QModelIndex& index, int role) const
{
    if(role == Qt::DisplayRole && !m_rows.empty())
    {
        return (m_rows.at(index.row()))[index.column()].c_str();
    }

    return QVariant::Invalid;
}
« Последнее редактирование: Февраль 06, 2016, 11:51 от Larry » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Февраль 05, 2016, 20:02 »

если удалить строчку 0, то строчкой 0 станет строчка 1. вектор же сдвигает индексы после удаления, а словарь — нет.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #2 : Февраль 05, 2016, 20:17 »

А тот словарь вообще гарантирует, что порядок ключей будет такой же как и при добавлении? Улыбающийся
Словари часто ключи хранят как хеши, из-за чего порядок не гарантируется
Записан

Larry
Гость
« Ответ #3 : Февраль 05, 2016, 21:34 »

Да это я чего-то не того спорол, но вышел на свежий воздух и понял:). Тогда вопрос, а как лучше сделать, чтобы можно было удалять данные. До этого делал через vector и сортировал по убыванию индексы. А можно как-то сделать без сортировки?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #4 : Февраль 05, 2016, 22:01 »

А тот словарь вообще гарантирует, что порядок ключей будет такой же как и при добавлении? Улыбающийся
Словари часто ключи хранят как хеши, из-за чего порядок не гарантируется
там же написано map, что гарантирует порядок (сортируется по ключам)
Да это я чего-то не того спорол, но вышел на свежий воздух и понял:). Тогда вопрос, а как лучше сделать, чтобы можно было удалять данные. До этого делал через vector и сортировал по убыванию индексы. А можно как-то сделать без сортировки?
так а чем вектор плох?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Larry
Гость
« Ответ #5 : Февраль 05, 2016, 22:49 »

только  тем, что необходимо дополнительно сортировать индексы перед удалением...хотя склоняюсь все же к вектору, если других вариантов нет.
Записан
Larry
Гость
« Ответ #6 : Февраль 06, 2016, 11:50 »

Все таки остановился на векторе. Устраивает всем...только при удалении не по порядку буду сортировать по убыванию - лишняя операция, но нагрузка на сортировку целых чисел не большая, тем более что этих индексов будет...ну максимум до 100, не более.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #7 : Февраль 06, 2016, 12:57 »

только при удалении не по порядку буду сортировать по убыванию - лишняя операция,

зачем ему снова сортировать, если у он и так отсортирован? )
Записан

Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Февраль 06, 2016, 13:08 »

Все таки остановился на векторе. Устраивает всем...только при удалении не по порядку буду сортировать по убыванию - лишняя операция, но нагрузка на сортировку целых чисел не большая, тем более что этих индексов будет...ну максимум до 100, не более.
Вас трудно понять. m_rows это map? (была). Тогда что такое m_rows.at ? Привели бы описания структур. И зачем "при удалении не по порядку буду сортировать"? После удаления порядок сортировки не нарушается. 
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #9 : Февраль 06, 2016, 15:43 »

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

зачем ему снова сортировать, если у он и так отсортирован? )
сортировать список удаляемых индексов по убыванию (чтоб out of range не получить, в прошлой теме обсуждалось)
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Larry
Гость
« Ответ #10 : Февраль 06, 2016, 17:10 »

m_rows это уже вектор Улыбающийся. А сортирую, как подтвердили для того, чтобы не схлопотать out of range. Удаляются элементы не по порядку.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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