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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: как обновлять qtmodel извне?  (Прочитано 4525 раз)
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()
в какой то другой раз, на нем и останавливается вся программа .. и ... вылетает
« Последнее редактирование: Декабрь 12, 2017, 06:15 от nvek » Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 574


Просмотр профиля
« Ответ #1 : Декабрь 12, 2017, 08:03 »

собсно везде где есть примеры, там добавление и удаление элементов завернуто в
Код:
BeginInsert/Remove()
//addChild
//delete
EndInsert/Remove()
так делать конечно не получается, потому что я сам лично не слежу за добавлением и удалением. Данные сами приходят и уходят.
...

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

Например, данные изменились -> событие необходимо обработать и преобразовать в сигнал модели dataChanged с указанием ячеек, на которые влияют данные (содержимое, цвета, шрифта и т.д.).
Если данные добавились -> необходимо вызвать beginInsert, провести изменения в модели, соответствующие изменениям данных, endInsert.
Если данные удалились -> необходимо вызвать beginRemove, провести изменения в модели, соответствующие изменениям данных, endRemove.
Это позволяет обеспечить согласованность модели и данных. Все другие способы будут приводить к описанным ошибкам.
Записан
nvek
Гость
« Ответ #2 : Декабрь 12, 2017, 09:14 »

Модель Qt  не разчитана чтобы данные обновлялись извне.
представим есть структура treeItem (иерархическая)
в определенные промежутки времени я "согласовываю" мои данные с данными которые пришли с сервера.
напрямую мне не выпустить уже сигнал beginInsert/Remove и endInsert/Remove из TreeItem
приходится:
отслеживать позицию этого элемента (добавленного или удаленного),
сопоставлять его с элементом ModelIndex. посылать сигнал чтобы он изменил 
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3257


Просмотр профиля
« Ответ #3 : Декабрь 12, 2017, 10:28 »

Вам нужна копия данных или более полный контроль над хранилищем.
В общем случае, модель может менять порядок данных (сортировка) или убирать часть их них (фильтрация).
Во втором случае нобходимо наличие дополнительной, фильтрованной копии.
Для экономии всегда можно использовать указатели (шаредные) на данные или индексы на них и хранить в модели вектор указателей.
Записан
nvek
Гость
« Ответ #4 : Декабрь 12, 2017, 14:16 »

Может вопрос покажется странным, но можно ли заблокировать все сигналы главной формы? в определенный промежуток?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3257


Просмотр профиля
« Ответ #5 : Декабрь 12, 2017, 14:52 »

Можно, но это чревато багами. Так делать не надо.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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