Russian Qt Forum

Qt => Model-View (MV) => Тема начата: OS2 от Февраль 16, 2016, 00:58



Название: Как отключить обновление вида QTableView?
Отправлено: OS2 от Февраль 16, 2016, 00:58
Всем доброго времени суток.

Подскажите, как отключить обновление вида, унаследованного от QTableView, у которого установлена табличная модель, унаследованная от QAbstractTableModel?
ЗЫ: тоесть необходимо, чтобы содержимое вида не обновлялось, а модель продолжала получать новые данные и обновлять другие виды?  ???

Заранее спасибо за ответ!


Название: Re: Как отключить обновление вида QTableView?
Отправлено: Igors от Февраль 16, 2016, 08:21
setUpdatesEnabled устраивает?


Название: Re: Как отключить обновление вида QTableView?
Отправлено: OS2 от Февраль 16, 2016, 09:50
К сожалению setUpdatesEnabled не подходит. Он полностью блокирует работу с видом, а я хотел, чтобы с видом можно было продолжать работать, но новые данные в него, из модели, не приходили...


Название: Re: Как отключить обновление вида QTableView?
Отправлено: Igors от Февраль 16, 2016, 10:09
К сожалению setUpdatesEnabled не подходит. Он полностью блокирует работу с видом, а я хотел, чтобы с видом можно было продолжать работать, но новые данные в него, из модели, не приходили...
Вчера отвечал  :)
Почему бы не сделать "обертку" для контейнера?  Рабочая нитка не удаляет, а увеличивает счетчик удаленных (или хранит индексы удаленных если можно удалять в любом порядке). Добавлять добавляет но rowCount возвращает старое значение. Разумеется все это тоже защищено локами. В итоге обе нитки работают с 1 контейнером, но модель какое-то время показывает его старую копию. Потом (хоть по таймеру) главная нитка посылает самой себе сигнал по которому (опять-таки под защитой лока) делается removeRows, удаленные реально удаляются, и insertRows. Все совершенно легально, и (на первый взгляд) несложно


Название: Re: Как отключить обновление вида QTableView?
Отправлено: OS2 от Февраль 16, 2016, 10:17
Ясно. Значит простого способа не существует...а жаль.  :(


Название: Re: Как отключить обновление вида QTableView?
Отправлено: Igors от Февраль 16, 2016, 10:29
Ясно. Значит простого способа не существует...а жаль.  :(
Попривыкали сладко кушать готовые классы  :)


Название: Re: Как отключить обновление вида QTableView?
Отправлено: Bepec от Февраль 16, 2016, 11:14
Таки интересная задача. В принципе можно написать модельку, которая будет хранить несколько наборов данных и в зависимости от View, которая запрашивает данные отдавать каждой view свой набор.

Но это задача не дня, тут только тестировать придётся недельку на мой взгляд.


Название: Re: Как отключить обновление вида QTableView?
Отправлено: VPS от Февраль 16, 2016, 11:46
К сожалению setUpdatesEnabled не подходит. Он полностью блокирует работу с видом, а я хотел, чтобы с видом можно было продолжать работать, но новые данные в него, из модели, не приходили...
Может тогда создать временную модель - копию существующей?
Только есть вопрос: насколько большая оригинальная модель и как поступать с обновлёнными данными во временной модели?


Название: Re: Как отключить обновление вида QTableView?
Отправлено: Racheengel от Февраль 16, 2016, 11:47
А что, сделать модель-копию и подключить ее ко вью уже не круто в 21 веке?

UP: vps, вы меня опередили :)


Название: Re: Как отключить обновление вида QTableView?
Отправлено: Igors от Февраль 16, 2016, 12:11
А что, сделать модель-копию и подключить ее ко вью уже не круто в 21 веке?
Это было всегда плохо еще в 20-м  :)


Название: Re: Как отключить обновление вида QTableView?
Отправлено: OS2 от Февраль 16, 2016, 12:47
Да, копии моделей делать не комильфо. Я думал есть более простой и элегантный способ решения моей проблемки... .  ;)


Название: Re: Как отключить обновление вида QTableView?
Отправлено: Racheengel от Февраль 16, 2016, 18:16
Да, копии моделей делать не комильфо. Я думал есть более простой и элегантный способ решения моей проблемки... .  ;)

Но у Вас же "сделать копию" предопределено самим условием:

тоесть необходимо, чтобы содержимое вида не обновлялось, а модель продолжала получать новые данные и обновлять другие виды?

То есть имеется модель, которая обновляется И к ней привязане ДРУГИЕ виды.
Ваш ВИД и, соответственно, ЕГО МОДЕЛЬ - это всего лишь "замороженная" копия оригинала.
Что не так с копированием?


Название: Re: Как отключить обновление вида QTableView?
Отправлено: Igors от Февраль 17, 2016, 05:02
То есть имеется модель, которая обновляется И к ней привязане ДРУГИЕ виды.
Ваш ВИД и, соответственно, ЕГО МОДЕЛЬ - это всего лишь "замороженная" копия оригинала.
Что не так с копированием?
То что данные "в 2 экземплярах", и их сбивка/синхронизация станет источником постоянных забот.


Название: Re: Как отключить обновление вида QTableView?
Отправлено: Racheengel от Февраль 17, 2016, 11:29
То что данные "в 2 экземплярах", и их сбивка/синхронизация станет источником постоянных забот.

С каких делов то? Человек знает, когда ему получить копию данных и отобразить их. Залочил основную модель - сделал копию - разлочил - вывел в гуй. Где здесь могуть быть проблемы?


Название: Re: Как отключить обновление вида QTableView?
Отправлено: Igors от Февраль 17, 2016, 15:44
С каких делов то? Человек знает, когда ему получить копию данных и отобразить их. Залочил основную модель - сделал копию - разлочил - вывел в гуй. Где здесь могуть быть проблемы?
А не надо искать "где" - они сами Вас найдут, и гораздо быстрее чем ожидалось. И в конце-концов, почесав репу, придется согласиться с тем что "прынцыпы" лучше не нарушать


Название: Re: Как отключить обновление вида QTableView?
Отправлено: Old от Февраль 17, 2016, 18:24
А не надо искать "где" - они сами Вас найдут, и гораздо быстрее чем ожидалось. И в конце-концов, почесав репу, придется согласиться с тем что "прынцыпы" лучше не нарушать
Какие принципы? Ваше решение не рабочее. ТС необходимо остановить обновление данных только для одного вида, остальные виды должны продолжить обновляться в штатном режиме. Вы этого обеспечить не сможете.
Так же ваше решение  рассчитывает, что данные будут добавляться в конец, а часто это не так.


Название: Re: Как отключить обновление вида QTableView?
Отправлено: Racheengel от Февраль 17, 2016, 18:24
А не надо искать "где" - они сами Вас найдут, и гораздо быстрее чем ожидалось. И в конце-концов, почесав репу, придется согласиться с тем что "прынцыпы" лучше не нарушать

Вот правда не понимаю, где при такой архитектуре могут быть проблемы :) Это самый что ни на есть юз-кейс "по принципам из УмнойТолстойКнижки" :)


Название: Re: Как отключить обновление вида QTableView?
Отправлено: Igors от Февраль 17, 2016, 18:33
Вот правда не понимаю, где при такой архитектуре могут быть проблемы :) Это самый что ни на есть юз-кейс "по принципам из УмнойТолстойКнижки" :)
Это просто "save" или "фотография", годится для "обозрения". Но как только юзер попытается что-то сделать с "видимыми" данными - польется как из ведра


Название: Re: Как отключить обновление вида QTableView?
Отправлено: Racheengel от Февраль 17, 2016, 18:40
Это просто "save" или "фотография", годится для "обозрения". Но как только юзер попытается что-то сделать с "видимыми" данными - польется как из ведра

Ну и пусть себе делает, что хочет. "Видимая" модель существует совершенно независимо от "реальной", так что ничего страшного не произойдет :)


Название: Re: Как отключить обновление вида QTableView?
Отправлено: Igors от Февраль 17, 2016, 18:46
Ну и пусть себе делает, что хочет. "Видимая" модель существует совершенно независимо от "реальной", так что ничего страшного не произойдет :)
Ага, а если, (как говорили выше) "несколько видов"? Вот Вы уже и приплыли.

Что такого сложного в "виртуальной" модели? В самом худшем случае это массив пар (какая строка контейнера соответствует вью). Зато все по уму - данные едины. Прям уже каждого куста боимся  :)   


Название: Re: Как отключить обновление вида QTableView?
Отправлено: Racheengel от Февраль 17, 2016, 18:49
Ага, а если, (как говорили выше) "несколько видов"? Вот Вы уже и приплыли.

Что такого сложного в "виртуальной" модели? В самом худшем случае это массив пар (какая строка контейнера соответствует вью). Зато все по уму - данные едины. Прям уже каждого куста боимся  :)   

И что с того, что несколько? Это MVC, на такое поведение и рассчитан. Одна модель - несколько видов.

"Виртуальная" модель, это прокси. Она будет рефлектировать изменения базовой модели, но автору то как раз это и не нужно, он хочет статичести видеть копию своих данных в какой-то момент истории.


Название: Re: Как отключить обновление вида QTableView?
Отправлено: Old от Февраль 17, 2016, 19:14
но автору то как раз это и не нужно, он хочет статичести видеть копию своих данных в какой-то момент истории.
А если данные расшарить, то можно избежать их дублирование в памяти.
Например, модель может хранить только умные указатели на элементы, при копировании модели мы продублируем только этот массив указателей. Что совершенно не скажется на возможности их модификации.