Russian Qt Forum

Qt => Model-View (MV) => Тема начата: nvek от Декабрь 12, 2017, 05:59



Название: как обновлять qtmodel извне?
Отправлено: nvek от Декабрь 12, 2017, 05:59
собсно везде где есть примеры, там добавление и удаление элементов завернуто в
Код:
BeginInsert/Remove()
//addChild
//delete
EndInsert/Remove()
так делать конечно не получается, потому что я сам лично не слежу за добавлением и удалением. Данные сами приходят и уходят.
Я пробовал вот так:
Код:
BeginInsert/Remove()
EndInsert/Remove()
//addChild
//delete
как поняли, вначале обновил индексы, а затем обновил содержимое. Вроде все работает. Но нет. а вернее не всегда.
Бывают такие случаи, когда:
вначале вызываются
Код:
BeginInsert/Remove()
EndInsert/Remove()
индексы почистятся, но потом не доходя до обновления содержимого, срабатывает делегат viewшки, он вызывает rowCount(), который видит что данные еще есть. дальше кастует индекст  к элементу модели, которого нет,  и затем падает.
Хах.  >:( >:(


Допустим есть метод update()
{
в нем я запросил актуальные данные
затем сравнил с данными которые у меня есть.
послал сигнал который говорит beginInsertRow() //но не завершает
дальше в цикле добавляю новые айтемы
затем хочу послать сигнал на завершение endInsertRow();
}

первая итерация прошла успешно, но когда доходит до beginInsertRow()
в какой то другой раз, на нем и останавливается вся программа .. и ... вылетает


Название: Re: как обновлять qtmodel извне?
Отправлено: ssoft от Декабрь 12, 2017, 08:03
собсно везде где есть примеры, там добавление и удаление элементов завернуто в
Код:
BeginInsert/Remove()
//addChild
//delete
EndInsert/Remove()
так делать конечно не получается, потому что я сам лично не слежу за добавлением и удалением. Данные сами приходят и уходят.
...

Что значит данные приходят и уходят сами?
Модель - это некоторое отражение реальных данных, которая позволяет сформировать их двумерное представление (список, таблица, дерево и др.).
Задача разработчика транслировать изменение данных в соответствующие изменения модели и ее сигналы.

Например, данные изменились -> событие необходимо обработать и преобразовать в сигнал модели dataChanged с указанием ячеек, на которые влияют данные (содержимое, цвета, шрифта и т.д.).
Если данные добавились -> необходимо вызвать beginInsert, провести изменения в модели, соответствующие изменениям данных, endInsert.
Если данные удалились -> необходимо вызвать beginRemove, провести изменения в модели, соответствующие изменениям данных, endRemove.
Это позволяет обеспечить согласованность модели и данных. Все другие способы будут приводить к описанным ошибкам.


Название: Re: как обновлять qtmodel извне?
Отправлено: nvek от Декабрь 12, 2017, 09:14
Модель Qt  не разчитана чтобы данные обновлялись извне.
представим есть структура treeItem (иерархическая)
в определенные промежутки времени я "согласовываю" мои данные с данными которые пришли с сервера.
напрямую мне не выпустить уже сигнал beginInsert/Remove и endInsert/Remove из TreeItem
приходится:
отслеживать позицию этого элемента (добавленного или удаленного),
сопоставлять его с элементом ModelIndex. посылать сигнал чтобы он изменил 


Название: Re: как обновлять qtmodel извне?
Отправлено: Авварон от Декабрь 12, 2017, 10:28
Вам нужна копия данных или более полный контроль над хранилищем.
В общем случае, модель может менять порядок данных (сортировка) или убирать часть их них (фильтрация).
Во втором случае нобходимо наличие дополнительной, фильтрованной копии.
Для экономии всегда можно использовать указатели (шаредные) на данные или индексы на них и хранить в модели вектор указателей.


Название: Re: как обновлять qtmodel извне?
Отправлено: nvek от Декабрь 12, 2017, 14:16
Может вопрос покажется странным, но можно ли заблокировать все сигналы главной формы? в определенный промежуток?


Название: Re: как обновлять qtmodel извне?
Отправлено: Авварон от Декабрь 12, 2017, 14:52
Можно, но это чревато багами. Так делать не надо.