Russian Qt Forum

Qt => Model-View (MV) => Тема начата: Larry от Февраль 05, 2016, 18:08



Название: [РЕШЕНО]И снова QTableView
Отправлено: 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;
}


Название: Re: И снова QTableView
Отправлено: kambala от Февраль 05, 2016, 20:02
если удалить строчку 0, то строчкой 0 станет строчка 1. вектор же сдвигает индексы после удаления, а словарь — нет.


Название: Re: И снова QTableView
Отправлено: gil9red от Февраль 05, 2016, 20:17
А тот словарь вообще гарантирует, что порядок ключей будет такой же как и при добавлении? :)
Словари часто ключи хранят как хеши, из-за чего порядок не гарантируется


Название: Re: И снова QTableView
Отправлено: Larry от Февраль 05, 2016, 21:34
Да это я чего-то не того спорол, но вышел на свежий воздух и понял:). Тогда вопрос, а как лучше сделать, чтобы можно было удалять данные. До этого делал через vector и сортировал по убыванию индексы. А можно как-то сделать без сортировки?


Название: Re: И снова QTableView
Отправлено: kambala от Февраль 05, 2016, 22:01
А тот словарь вообще гарантирует, что порядок ключей будет такой же как и при добавлении? :)
Словари часто ключи хранят как хеши, из-за чего порядок не гарантируется
там же написано map, что гарантирует порядок (сортируется по ключам)
Да это я чего-то не того спорол, но вышел на свежий воздух и понял:). Тогда вопрос, а как лучше сделать, чтобы можно было удалять данные. До этого делал через vector и сортировал по убыванию индексы. А можно как-то сделать без сортировки?
так а чем вектор плох?


Название: Re: И снова QTableView
Отправлено: Larry от Февраль 05, 2016, 22:49
только  тем, что необходимо дополнительно сортировать индексы перед удалением...хотя склоняюсь все же к вектору, если других вариантов нет.


Название: Re: И снова QTableView
Отправлено: Larry от Февраль 06, 2016, 11:50
Все таки остановился на векторе. Устраивает всем...только при удалении не по порядку буду сортировать по убыванию - лишняя операция, но нагрузка на сортировку целых чисел не большая, тем более что этих индексов будет...ну максимум до 100, не более.


Название: Re: И снова QTableView
Отправлено: gil9red от Февраль 06, 2016, 12:57
только при удалении не по порядку буду сортировать по убыванию - лишняя операция,

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


Название: Re: И снова QTableView
Отправлено: Igors от Февраль 06, 2016, 13:08
Все таки остановился на векторе. Устраивает всем...только при удалении не по порядку буду сортировать по убыванию - лишняя операция, но нагрузка на сортировку целых чисел не большая, тем более что этих индексов будет...ну максимум до 100, не более.
Вас трудно понять. m_rows это map? (была). Тогда что такое m_rows.at ? Привели бы описания структур. И зачем "при удалении не по порядку буду сортировать"? После удаления порядок сортировки не нарушается. 


Название: Re: [РЕШЕНО]И снова QTableView
Отправлено: kambala от Февраль 06, 2016, 15:43
отсортировать десяток интов значительное время не займет, я б не заморачивался.
только при удалении не по порядку буду сортировать по убыванию - лишняя операция,

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


Название: Re: И снова QTableView
Отправлено: Larry от Февраль 06, 2016, 17:10
m_rows это уже вектор :). А сортирую, как подтвердили для того, чтобы не схлопотать out of range. Удаляются элементы не по порядку.