Название: beginRemoveRows не понятно как работает Отправлено: spectre71 от Июнь 26, 2009, 14:55 Делаю:
Код
Какого фига при вызове beginRemoveRows у меня вызывается onCurrentChanged и соответственно меняется itemIndex(current.row()); Логично что это должно происходить на endRemoveRows Название: Re: beginRemoveRows не понятно как работает Отправлено: Rcus от Июнь 26, 2009, 15:27 beginRemoveRows оповещает представления об удалении данных, чтобы те больше не ссылались на них, отменили редактирование. Потом пересчитываются индексы(если точнее то в begin происходит инвалидация, в end процедура перерасчета). А endRemoveRows оповещает об окончании изменений. (RTFS)
Название: Re: beginRemoveRows не понятно как работает Отправлено: spectre71 от Июнь 26, 2009, 15:57 beginRemoveRows оповещает представления об удалении данных, чтобы те больше не ссылались на них, отменили редактирование. Потом пересчитываются индексы(если точнее то в begin происходит инвалидация, в end процедура перерасчета). А endRemoveRows оповещает об окончании изменений. (RTFS) Что значит инвалидация?Логично когда на "begin..." делаются оповещения и блокировки, а на "end..." изменения и разблокировки. Здесь же какой-то бред. Название: Re: beginRemoveRows не понятно как работает Отправлено: Rcus от Июнь 26, 2009, 17:15 Поскольку представления могут хранить индексы для собственных нужд (QPersistentModelIndex), то модель соответсвенно хранит список этих индексов, чтобы обновлять их при изменении данных.
Инвалидация в данном случае это заполнение списка индексов подлежащих перерасчету по причине смещения, либо обнулению в результате удаления. Что же насчет "бреда", то это довольно провокационное заявление с вашей стороны. В области истории систем связи данных с UI я не большой специалист, потому не смогу аргументированно опровергнуть вашу точку зрения, но все же могу заметить что Qt существует не первый год и подсистема Interview возникла как результат эволюции, а потому, возможно, учитывает проблемы которые возникали в предыдущих реализациях. Название: Re: beginRemoveRows не понятно как работает Отправлено: ритт от Июнь 26, 2009, 17:38 Rcus, ого :)
я свой комментарий по этому поводу решил оставить при себе...он был много короче :) /* по поводу винта соболезную */ Spectre, всё правильно - так и должно быть. Название: Re: beginRemoveRows не понятно как работает Отправлено: spectre71 от Июнь 26, 2009, 17:58 Поскольку представления могут хранить индексы для собственных нужд (QPersistentModelIndex), то модель соответсвенно хранит список этих индексов, чтобы обновлять их при изменении данных. С чего оно провокационное?Инвалидация в данном случае это заполнение списка индексов подлежащих перерасчету по причине смещения, либо обнулению в результате удаления. Что же насчет "бреда", то это довольно провокационное заявление с вашей стороны. В области истории систем связи данных с UI я не большой специалист, потому не смогу аргументированно опровергнуть вашу точку зрения, но все же могу заметить что Qt существует не первый год и подсистема Interview возникла как результат эволюции, а потому, возможно, учитывает проблемы которые возникали в предыдущих реализациях. Если вы хотите сказать что QT настолько круто, что там нет концептуальных ошибок, то вы не правы. Насчет эволюции вы правы, она есть, но то что на данной стадии все хорошо, я не согласен. Название: Re: beginRemoveRows не понятно как работает Отправлено: spectre71 от Июнь 26, 2009, 18:04 Spectre, всё правильно - так и должно быть. Просто концептуальная ошибка. Скорее всего дело в том что QItemSelectionModel реально на уровне "View", а не "Model". Название: Re: beginRemoveRows не понятно как работает Отправлено: Rcus от Июнь 26, 2009, 18:11 С чего оно провокационное? Если вы хотите сказать что QT настолько круто, что там нет концептуальных ошибок, то вы не правы. Насчет эволюции вы правы, она есть, но то что на данной стадии все хорошо, я не согласен. В том то и дело, что оно провоцирует искать аргументы в защиту архитектуры Qt, что обычно выливается в страницы флейма /*\see Qt vs .NET*/ а не обсуждать решения интересных задач возникающих при работе. Хотя конечно Qt не идеальная библиотека, просто остальные еще хуже :) (Это уже провокация любителей gtk, wx, mfc, wpf с моей стороны) Название: Re: beginRemoveRows не понятно как работает Отправлено: spectre71 от Июнь 26, 2009, 18:20 В том то и дело, что оно провоцирует искать аргументы в защиту архитектуры Qt, что обычно выливается в страницы флейма /*\see Qt vs .NET*/ а не обсуждать решения интересных задач возникающих при работе. Я согласен что остальные гораздо хуже. :)Хотя конечно Qt не идеальная библиотека, просто остальные еще хуже :) (Это уже провокация любителей gtk, wx, mfc, wpf с моей стороны) А защищать слабые места архитектуры не надо. Надо пытаться их понять и искать способы обойти и/или если есть возможность влиять на ее дальнейшее развитие. Название: Re: beginRemoveRows не понятно как работает Отправлено: BRE от Июнь 26, 2009, 20:02 А защищать слабые места архитектуры не надо. Надо пытаться их понять и искать способы обойти и/или если есть возможность влиять на ее дальнейшее развитие. А на столько ли ты понял архитектуру MVC в реализации Qt, что считаешь ее слабой? ;)Может сначало нужно хорошенько с ней разобраться и возможно такие мысли уйдут сами собой? Пока это выглядит как: "Я ожидал вот это, но это работает не так как я ожидал, значит это концептуальная ошибка!" :) Цитировать Просто концептуальная ошибка. Скорее всего дело в том что QItemSelectionModel реально на уровне "View", а не "Model". А QItemSelectionModel и должна находиться на уровне View.Источник данных не должна запоминать, что выбрал пользователь, он просто должна вернуть данные по запросу. Название: Re: beginRemoveRows не понятно как работает Отправлено: spectre71 от Июнь 27, 2009, 10:14 А на столько ли ты понял архитектуру MVC в реализации Qt, что считаешь ее слабой? ;) Может сначало нужно хорошенько с ней разобраться и возможно такие мысли уйдут сами собой? Пока это выглядит как: "Я ожидал вот это, но это работает не так как я ожидал, значит это концептуальная ошибка!" :) А на столько ли ты понял архитектуру MVC в реализации Qt что можешь привести мне выдержки из документации и указать на мою ошибку? И по поводу MVC, ее как таковой в QT нет, есть только MV. А QItemSelectionModel и должна находиться на уровне View. Источник данных не должна запоминать, что выбрал пользователь, он просто должна вернуть данные по запросу. А это весьма сомнительное утверждение. Все зависит от источника данных и текущего его использования. В большенстве моих списочных данных, есть понятие выбранный элемент, который должен поддерживаться актуальным, если список не пуст и не должен просто так прыгать туда-сюда, как это получилось с beginRemoveRows. Именно данные у меня определяют выбранный элемент, а не View. View может только так или иначе отображать и обеспечевать возможность изменения выборанного элемента. А в текущей MV концепции получается большой геморой с синхронизацией селекции между представлением и данными. Уже начальная установка селекции не обеспечивается уровнем модели, устанавливая модель во View приходиться еще и устанавливать правильно селекцию, а модель про селекцию ничего не знает! Тоже самое происходит при перемещениях элементов списка их удаления, добавления: заново приходиться переустанавливать селекцию, при этом блокируя обратную связь селекции с моделью. Привиду пример того что у меня происходит при изменении выбранного элемента в одном из списков данных "Project". "Project" - граф узлами которого являются задачи, а ребра связи между задачами(передача данных от одних задач к другим). "Project" - имеет 2 визуальных представления: - список задач в QTableView - граф в Pipeline Editor Выбрать текущую можно как в одном так и в другом представлении и это должно быть синхронизировано! При изменении выбранной(текущей) задачи происходит переустановка данных в массе компонентов: - Property Editor (свойства задачи) - Console (может потребовать закрытия, открытия и прочтения определенных файлов) - Таблиц со списками результатов - Вспомогательных компонентов типа редактор комментариев, краткая документация по программе, краткая документация по выбранному свойству.... - Обновление состояния QAction(s) Кроме этого происходят определенные перерасчеты и обновления данных. И все это завязано на выбранный элемент(задачу) данного списка, и текущие элементы иерархически вложенных данных. И вы мне предлагаете ради одного из представлений отвязать текущий элемент от данных? Название: Re: beginRemoveRows не понятно как работает Отправлено: BRE от Июнь 27, 2009, 10:34 Модели в Qt является по сути хранилищем данных с универсальным интерфейсом, в котором можно хранить как табличные, там и древовидные структуры. Они отвечают только за это.
Ты же не требуешь, что бы сервер баз данных хранил выбранные записи для каждого пользователя, это не его задача. Ты же не требуешь от QList возможности отметить несколько элементов и удалить вызовом одного метода. Все это только хранилища, они не должны обеспечивать какой то дополнительный функционал. На счет селекции, храни модель, храни селект-модель для нее. Если удобней (а мне кажется будет удобней) объедини их в одну сущность и поддерживай актуальность в ней. Все изменения делай через интерфейс этой сущности, тогда никто из вне не сможет изменить данные в модели без изменения селект-модели. Добавь в сущьность необходимые сигналы, которые будут вызываться при определенных изменениях, слоты, которые будут модифицировать состояния. Название: Re: beginRemoveRows не понятно как работает Отправлено: spectre71 от Июнь 29, 2009, 09:44 Модели в Qt является по сути хранилищем данных с универсальным интерфейсом, в котором можно хранить как табличные, там и древовидные структуры. Они отвечают только за это. Ты же не требуешь, что бы сервер баз данных хранил выбранные записи для каждого пользователя, это не его задача. Ты же не требуешь от QList возможности отметить несколько элементов и удалить вызовом одного метода. Все это только хранилища, они не должны обеспечивать какой то дополнительный функционал. Модель - не является хранилищам данных как контейнер. Она является интерфейсом, в некотором смысле адаптером. Просто хранилища - контейнеры. Какие сущности должна представлять модель зависит от задачи и возможностей View. У меня одной из таких сущностей является текущий элемент, но к сожалению модели QT это не поддерживают, как и не обеспечивают интерфейс для перемещения данных. С сервером баз данных неудачный пример, там можно хранить для кого хочешь, что хочешь и как хочешь, и обеспечивать нужную функциональность в зависимости от задачи и возможностей СУБД. QList - не модель, а контейнер и к делу никак не относиться. На счет селекции, храни модель, храни селект-модель для нее. Если удобней (а мне кажется будет удобней) объедини их в одну сущность и поддерживай актуальность в ней. Все изменения делай через интерфейс этой сущности, тогда никто из вне не сможет изменить данные в модели без изменения селект-модели. Добавь в сущьность необходимые сигналы, которые будут вызываться при определенных изменениях, слоты, которые будут модифицировать состояния. В данной ситуации это одно из возможных решений. Но для меня очень неудобное. Одно дело над нужным классом прикрутить сверху модель, другое так или иначе встраивать в этот класс селекцию. Проще обновлять селекцию из модели (сигналом) и блокировать в нужные моменты обратную связь (на изменение селекции). Название: Re: beginRemoveRows не понятно как работает Отправлено: ритт от Июнь 29, 2009, 22:13 а что же будет, когда потребуется установить эту модель второй, третьей (и т.д.) вьюхе?
Название: Re: beginRemoveRows не понятно как работает Отправлено: spectre71 от Июнь 30, 2009, 08:34 а что же будет, когда потребуется установить эту модель второй, третьей (и т.д.) вьюхе? Если речь о моей модели(которая в примере), то она как раз и находится в 2х View, QTableView & PipelineEditor(мой компонент). И обязана иметь везде одну и ту же селекцию.Название: Re: beginRemoveRows не понятно как работает Отправлено: ритт от Июнь 30, 2009, 08:43 уж не задача ли это самой вьюхи - следить за селекшенами? вроде, персистент индексы ещё никто не отменял...
Название: Re: beginRemoveRows не понятно как работает Отправлено: spectre71 от Июль 02, 2009, 10:27 уж не задача ли это самой вьюхи - следить за селекшенами? вроде, персистент индексы ещё никто не отменял... Только отчасти, в случае когда не предпологается изменение данных при изменении селекции этот подход верен. В моем случае это не так. Данные, например клас TProject, имеет int itemIndex(void) и void itemIndex(int). Селекция во View всегда должна соответствовать itemIndex. При смене селекции должен устанавливаться itemIndex(int), а это мало того что тяжелая операция, она еще и не простая в плане синхронизации с другими данными. itemIndex может быть изменен как через View, так и из других мест! При удалении элементов из списка TProject может измениться itemIndex, в зависимости какой элемент удаляется, и механизм того как изменяется itemIndex встроен в TProject. Теперь смотрим что получается: Код
Посмотри в TPLProject::deleteTask вызов метода модели beginDeleteTask(rem_ind); и сам метод в модели! Если не использовать блокировку, то получается: при вызове beginRemoveRows(QModelIndex(), Project->itemIndex(), Project->itemIndex()); меняется селекция и вызывается TPLProject::itemIndex(int) и возникают большие неприятности. уж не задача ли это самой вьюхи - следить за селекшенами? вроде, персистент индексы ещё никто не отменял... Причем здесь персистент индексы, я не понял? |