Russian Qt Forum
Ноябрь 26, 2024, 00:49
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Пользовательский интерфейс (GUI)
>
Сигнал, и его обработка во время выполнения другой функции, равно сегфолт
Страниц:
1
2
[
3
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Сигнал, и его обработка во время выполнения другой функции, равно сегфолт (Прочитано 22603 раз)
xintrea
Супер активный житель
Offline
Сообщений: 754
Re: Сигнал, и его обработка во время выполнения другой функции, равно сегфолт
«
Ответ #30 :
Декабрь 16, 2008, 14:54 »
Всем спасибо за советы, сделаю, наверно, как
BRE
сказал.
Записан
Собираю информацию по крупицам
http://webhamster.ru
xintrea
Супер активный житель
Offline
Сообщений: 754
Re: Сигнал, и его обработка во время выполнения другой функции, равно сегфолт
«
Ответ #31 :
Декабрь 19, 2008, 14:14 »
Фух, ерунда какая-то получается.
Концепция "не менять модель для QListView, а перестраивать ее" упирается вот во что.
К вьюхе (QListView) виджет прикручивает модель. Виджет может влиять на модель - по своим кнопкам вызывать методы вставки, замены, удаления данных в модели. А вьюха все эти изменения показывает.
Нам нужно перестроить модель. Что для этого надо сделать? Вначале надо удалить строки из модели, и понапихать новых строк из новой пришедшей для замены модели.
Что при этом произойдет? В моей программе в момент удаления строк из модели, они действительно удалятся, т.е. удаление будет сопровождаться удалением хранимых данных на винте. Потом при напихивании новых строк, произойдет, грубо говоря, копирование данных - данные из модели новой отображаемой ветки понапихаются в модель предыдущей ветки. В момент "напихивания" модель тоже будет все записывать на винт.
То есть, надо делать как-то по-другому. Но как? Вроде вьюха занимается только тем чем ей положено - показывает данные. Модель тоже занимается тем чем ей положено - реагирует на команды виджета и управляет данными. Что я блин не так спроектировал?
Записан
Собираю информацию по крупицам
http://webhamster.ru
BRE
Гость
Re: Сигнал, и его обработка во время выполнения другой функции, равно сегфолт
«
Ответ #32 :
Декабрь 19, 2008, 17:14 »
Цитата: xintrea от Декабрь 19, 2008, 14:14
Нам нужно перестроить модель. Что для этого надо сделать? Вначале надо удалить строки из модели, и понапихать новых строк из новой пришедшей для замены модели.
Ничего в модели удалять не надо, нужно сделать так, что бы в следующий раз она для view'а возвращала те данные, которые необходимы для отображения в текущий момент. Изменился текущий элемент в treeView, мы известили об этом модель, модель начала возвращать для view данные для текущего элемента.
Или как вариант, можно сделать одну модель со всей работай с данными, а для вывода использовать прокси-модель.
Записан
xintrea
Супер активный житель
Offline
Сообщений: 754
Re: Сигнал, и его обработка во время выполнения другой функции, равно сегфолт
«
Ответ #33 :
Декабрь 19, 2008, 21:12 »
Цитата: BRE от Декабрь 19, 2008, 17:14
Ничего в модели удалять не надо, нужно сделать так, что бы в следующий раз она для view'а возвращала те данные, которые необходимы для отображения в текущий момент. Изменился текущий элемент в treeView, мы известили об этом модель, модель начала возвращать для view данные для текущего элемента.
Или как вариант, можно сделать одну модель со всей работай с данными, а для вывода использовать прокси-модель.
У меня, при открытии программы, создается и заполняется (из XML) дерево итемов для QTreeView. В каждом QTreeView итеме хранится модель списка QListView (которае тоже из XML заполняется). То есть, в экземплярах модели для QListView хранятся данные. (Ничего плохого в этом не вижу, то есть хранимые данные и методы работы с ними обобщены в одном классе).
В данный момент, когда меняется ветка, просто передается указатель на модель для новой открываемой ветки. Модели для QListView уже содержат нужные данные, заполненные в нее при старте программы.
То есть, при такой схеме, "сделать так, что бы в следующий раз модель для view'а возвращала те данные, которые необходимы для отображения в текущий момент" видимо не получится.
Правильно ли я понимаю, что в такой ситуации остается только два варианта -
1. решение с прокси-моделью,
2. переделывать всю структуру приложения
?
Записан
Собираю информацию по крупицам
http://webhamster.ru
ритт
Гость
Re: Сигнал, и его обработка во время выполнения другой функции, равно сегфолт
«
Ответ #34 :
Декабрь 19, 2008, 21:41 »
удаляй строки, данные удалять не надо. это плохая практика - на каждоую манипуляцию дёргать необратимые действия...
сделай примерно так: пусть метод удаления данных/строк (например, remove(...)) вместо физического удаления просто помечает строку на удаление и скрывает её из вьюхи (removeRows(...) в самой модели), а потом на commit() уже выполняй запланированные действия с данными.
это на мой взгляд более правильный подход.
либо чуть иначе: в своей модели переопредели removeRows(...) для физического удаления данных под строкой, а при синхронизации с другой моделью (aka append(),prepend(),substract() модели на модель) используй removeRows(...) суперкласса, что не приведёт к физическому удалению данных.
Записан
ритт
Гость
Re: Сигнал, и его обработка во время выполнения другой функции, равно сегфолт
«
Ответ #35 :
Декабрь 19, 2008, 21:42 »
> В каждом QTreeView итеме хранится модель
некошерно
Записан
BRE
Гость
Re: Сигнал, и его обработка во время выполнения другой функции, равно сегфолт
«
Ответ #36 :
Декабрь 19, 2008, 22:28 »
Цитата: xintrea от Декабрь 19, 2008, 21:12
У меня, при открытии программы, создается и заполняется (из XML) дерево итемов для QTreeView. В каждом QTreeView итеме хранится модель списка QListView (которае тоже из XML заполняется). То есть, в экземплярах модели для QListView хранятся данные. (Ничего плохого в этом не вижу, то есть хранимые данные и методы работы с ними обобщены в одном классе).
Пусть в каждом QTreeView-итеме храниться не модель, а твоя струтура данных. Вот эта структура и будет передаваться в модель, а модель будет из нее брать данные и отдовать viewer'у.
Записан
ритт
Гость
Re: Сигнал, и его обработка во время выполнения другой функции, равно сегфолт
«
Ответ #37 :
Декабрь 19, 2008, 22:53 »
указатель или ссылка на структуру данных, если уж на то пошло...
а ещё лучше - указатель на источник данных и параметры выобрки - не придётся строить все структуры в момент создания дерева (если источник неповоротливый)
Записан
BRE
Гость
Re: Сигнал, и его обработка во время выполнения другой функции, равно сегфолт
«
Ответ #38 :
Декабрь 19, 2008, 23:10 »
Цитата: Константин от Декабрь 19, 2008, 22:53
указатель или ссылка на структуру данных, если уж на то пошло...
Ну, xintrea вроде не идиот, что бы ему все так подробно расписывать, думаю он бы это и сам понял.
Записан
Страниц:
1
2
[
3
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...