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

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

Страниц: 1 2 [3]   Вниз
  Печать  
Автор Тема: Сигнал, и его обработка во время выполнения другой функции, равно сегфолт  (Прочитано 22603 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #30 : Декабрь 16, 2008, 14:54 »

Всем спасибо за советы, сделаю, наверно, как BRE сказал.
Записан

Собираю информацию по крупицам
http://webhamster.ru
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #31 : Декабрь 19, 2008, 14:14 »

Фух, ерунда какая-то получается.

Концепция "не менять модель для QListView, а перестраивать ее" упирается вот во что.

К вьюхе (QListView) виджет прикручивает модель. Виджет может влиять на модель - по своим кнопкам вызывать методы вставки, замены, удаления данных в модели. А вьюха все эти изменения показывает.

Нам нужно перестроить модель. Что для этого надо сделать? Вначале надо удалить строки из модели, и понапихать новых строк из новой пришедшей для замены модели.

Что при этом произойдет? В моей программе в момент удаления строк из модели, они действительно удалятся, т.е. удаление будет сопровождаться удалением хранимых данных на винте. Потом при напихивании новых строк, произойдет, грубо говоря, копирование данных - данные из модели новой отображаемой ветки понапихаются в модель предыдущей ветки. В момент "напихивания" модель тоже будет все записывать на винт.


То есть, надо делать как-то по-другому. Но как? Вроде вьюха занимается только тем чем ей положено - показывает данные. Модель тоже занимается тем чем ей положено - реагирует на команды виджета и управляет данными. Что я блин не так спроектировал?
Записан

Собираю информацию по крупицам
http://webhamster.ru
BRE
Гость
« Ответ #32 : Декабрь 19, 2008, 17:14 »

Нам нужно перестроить модель. Что для этого надо сделать? Вначале надо удалить строки из модели, и понапихать новых строк из новой пришедшей для замены модели.
Ничего в модели удалять не надо, нужно сделать так, что бы в следующий раз она для view'а возвращала те данные, которые необходимы для отображения в текущий момент. Изменился текущий элемент в treeView, мы известили об этом модель, модель начала возвращать для view данные для текущего элемента.

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

Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #33 : Декабрь 19, 2008, 21:12 »

Ничего в модели удалять не надо, нужно сделать так, что бы в следующий раз она для view'а возвращала те данные, которые необходимы для отображения в текущий момент. Изменился текущий элемент в treeView, мы известили об этом модель, модель начала возвращать для view данные для текущего элемента.

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

У меня, при открытии программы, создается и заполняется (из XML) дерево итемов для QTreeView. В каждом QTreeView итеме хранится модель списка QListView (которае тоже из XML заполняется). То есть, в экземплярах модели для QListView хранятся данные. (Ничего плохого в этом не вижу, то есть хранимые данные и методы работы с ними обобщены в одном классе).

В данный момент, когда меняется ветка, просто передается указатель на модель для новой открываемой ветки. Модели для QListView уже содержат нужные данные, заполненные в нее при старте программы.

То есть, при такой схеме, "сделать так, что бы в следующий раз модель для view'а возвращала те данные, которые необходимы для отображения в текущий момент" видимо не получится.


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

?
Записан

Собираю информацию по крупицам
http://webhamster.ru
ритт
Гость
« Ответ #34 : Декабрь 19, 2008, 21:41 »

удаляй строки, данные удалять не надо. это плохая практика - на каждоую манипуляцию дёргать необратимые действия...
сделай примерно так: пусть метод удаления данных/строк (например, remove(...)) вместо физического удаления просто помечает строку на удаление и скрывает её из вьюхи (removeRows(...) в самой модели), а потом на commit() уже выполняй запланированные действия с данными.
это на мой взгляд более правильный подход.

либо чуть иначе: в своей модели переопредели removeRows(...) для физического удаления данных под строкой, а при синхронизации с другой моделью (aka append(),prepend(),substract() модели на модель) используй removeRows(...) суперкласса, что не приведёт к физическому удалению данных.
Записан
ритт
Гость
« Ответ #35 : Декабрь 19, 2008, 21:42 »

> В каждом QTreeView итеме хранится модель
некошерно
Записан
BRE
Гость
« Ответ #36 : Декабрь 19, 2008, 22:28 »

У меня, при открытии программы, создается и заполняется (из XML) дерево итемов для QTreeView. В каждом QTreeView итеме хранится модель списка QListView (которае тоже из XML заполняется). То есть, в экземплярах модели для QListView хранятся данные. (Ничего плохого в этом не вижу, то есть хранимые данные и методы работы с ними обобщены в одном классе).
Пусть в каждом QTreeView-итеме храниться не модель, а твоя струтура данных. Вот эта структура и будет передаваться в модель, а модель будет из нее брать данные и отдовать viewer'у.
Записан
ритт
Гость
« Ответ #37 : Декабрь 19, 2008, 22:53 »

указатель или ссылка на структуру данных, если уж на то пошло...
а ещё лучше - указатель на источник данных и параметры выобрки - не придётся строить все структуры в момент создания дерева (если источник неповоротливый)
Записан
BRE
Гость
« Ответ #38 : Декабрь 19, 2008, 23:10 »

указатель или ссылка на структуру данных, если уж на то пошло...
Ну, xintrea вроде не идиот, что бы ему все так подробно расписывать, думаю он бы это и сам понял.  Подмигивающий
Записан
Страниц: 1 2 [3]   Вверх
  Печать  
 
Перейти в:  


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