Проблемы редактирования DOM модели, Доработка модели к редактируемой |
Здравствуйте, гость ( Вход | Регистрация )
Проблемы редактирования DOM модели, Доработка модели к редактируемой |
JohnZ |
26.11.2014, 13:46
Сообщение
#1
|
Участник Группа: Участник Сообщений: 139 Регистрация: 19.7.2014 Пользователь №: 4190 Спасибо сказали: 10 раз(а) Репутация: 0 |
В прицепе мин. проект, демонстрирующий проблемы редактирования.
ехе-шник там-же ... Проблемы в диалоге редактирования таблицы (через модель !). Для того, чтобы к нему добраться, нужно в открытом конфиге (прилагается) пройти по дереву от корня /->metadata->catalogues-> далее выбрать любой справочник ( catalogue ) и в нём DblClick на таблице ( element ). Появится диалог редактирования таблицы. Вопросы ... 1. В диалоге реализовано удаление поля, кнопка Del. Сделано по подобию примера editabletreemodel. После удаления, в bool DomItem::removeChildrens(int position, int count) добавлена очистка хэш-а childItems.clear(), т.к. без этого нет отоббражения действия в TreeView-e за диалогом, при развёрнутом дереве полей таблицы. В принципе к функции удаления претензий нет, работает отлично, но правомочна-ли очистка хэш-а в плане утечек памяти ? Ведь указатели на DomItem-ы хранятся только в хэше, а операция QHash::clear() для QHash<int,DomItem*> childItems; не чистит хранимые указатели на DomItem *, которые созданы операцией new !? Если это действительно так, подскажите плз правильную реализацию ... 2. Реализация добавления поля аналогична удалению, в проект не ложил, т.к. там понятно, через отдельный диалог. Проблема в реализации bool swapChildrens(int pos1, int pos2); Для добавления и удаления поля в модели есть соотв-щие ф-ции
и
Но в модели нет функций beginSwapRows(parent, position, position + 1); endSwapRows(); Как это можно реализовать (с отображением в TreeView-e), как в случае с удалением ? 3. Почему при открытии диалога, строка выбора в TreeView-e скачет хз куда ? Странно это потому, что в оригинальном проекте, когда TreeView является MdiChild-ом, такого не наблюдается ... Это так, из спортивного интереса :-) Заранее благодарен за помощь.
Прикрепленные файлы
|
|
|
lanz |
26.11.2014, 22:13
Сообщение
#2
|
Старейший участник Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: 8 |
1. Хэш никак с этим не связан. У меня все удаляется даже если закоментарить clear()
Память течет, именно потому что вы сказали. Уберите хэш вообще, насовсем. Здесь он не нужен пока, только все запутывает. Утекает вот отсюда:
Зачем вам параллельная иерархия DomItem которую вы пересоздаете каждый раз когда не найден элемент в хэше? Модель может работать и с кутешным DOM-деревом. Тоже сильно все упростит. 2. http://qt-project.org/doc/qt-4.8/qabstract...l#beginMoveRows Или можете просто вызвать dataChanged для обоих строк после того как поменяете их внутри своей модели. 3. У меня все работает Не скачет. |
|
|
JohnZ |
27.11.2014, 17:57
Сообщение
#3
|
Участник Группа: Участник Сообщений: 139 Регистрация: 19.7.2014 Пользователь №: 4190 Спасибо сказали: 10 раз(а) Репутация: 0 |
1. Хэш никак с этим не связан. У меня все удаляется даже если закоментарить clear() Если закоментарить clear(), то нет "динамики", изменения в дереве будут видны только после закрытия диалога. Если он есть, то изменения видны даже ЗА диалогом ! Цитата Память течет, именно потому что вы сказали. Уберите хэш вообще, насовсем. Здесь он не нужен пока, только все запутывает. Хм ... Я об этом даже не задумывался, надо обмозговать ... Может ты и прав ... Цитата Утекает вот отсюда:
Всё правильно, я именно об этом "new" и спрашивал. Я уже пробовал вручную чистить элементы из хэш-а, удаляя вначале все DomItem * и затем childItems.clear(), - вообще вылетает в ошибку доступа к "мусорной" памяти при перестройке модели, откуда-то из глубин dll-ки ... Даже студия затыкается :-( Цитата Зачем вам параллельная иерархия DomItem которую вы пересоздаете каждый раз когда не найден элемент в хэше? В QT-шном примере так было сделано. Я взял за основу предполагая, что это наилучший способ работы с DOM-деревом. Кроме того, оказалось просто расширить эту структуру (DomItem), добавляя элементы для своих нужд ( IDD, IDС и т.д. ) Цитата Модель может работать и с кутешным DOM-деревом. Тоже сильно все упростит. А вот тут поподробнее можно ? Начиная с какой версии QT есть такая фича ? (у меня 4.5.3) Примерчик _редактируемой_ DOM-модели в TreeView есть ? Хотя это и повлечёт солидную переделку проекта, но я за упрощение ! Подскажи где копать, т.е. что брать за основу ? (по аналогии с simpledommodel) Совсем с нуля опять начинать не хоцца ... Цитата 2. http://qt-project.org/doc/qt-4.8/qabstract...l#beginMoveRows Или можете просто вызвать dataChanged для обоих строк после того как поменяете их внутри своей модели. beginMoveRows - Дык это начиная с 4.6.0. Видимо придётся переходить на 4.6.х Жаль ... Линуксы 4-6 летней давности, работающие и поныне на "слабых" машинах, собраны на версии 4.3.х ... 4.5.х. Цитата 3. У меня все работает Не скачет. Спишем на глюк QTreeView в SDI lanz, Благодарю за помощь ! Сообщение отредактировал JohnZ - 27.11.2014, 18:20 |
|
|
lanz |
27.11.2014, 21:38
Сообщение
#4
|
Старейший участник Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: 8 |
после закрытия диалога. Если он есть, то изменения видны даже ЗА диалогом ! Тут проблема в том что после удаления из списка(в модели списка) элементы идут так: 1234 -> 123 (и это какой бы мы элемент ни удалили) А в хэшк зависит от того какой элемент мы удаляем 1234 -> 123 (если 4) 1234 -> 234 (если 1) и т.д. Поэтому переформирование хэша помогает. Почему работало когда ты закрывал диалог: шло обновление и он перебирал все строки. Когда доходил до той которой нет, весь хэш обновлялся и дальше шло все по порядку. Выброси хэш, сразу станет сильно легче Цитата А вот тут поподробнее можно ? Начиная с какой версии QT есть такая фича ? (у меня 4.5.3) Примерчик _редактируемой_ DOM-модели в TreeView есть ? Хотя это и повлечёт солидную переделку проекта, но я за упрощение ! Подскажи где копать, т.е. что брать за основу ? (по аналогии с simpledommodel) Совсем с нуля опять начинать не хоцца ... Имел ввиду QDomNode и сотоварищей. Ты же по сути строишь дублирующую структуру. Цитата beginMoveRows - Дык это начиная с 4.6.0. Видимо придётся переходить на 4.6.х Жаль ... Можно просто вызвать dataChanged для этих двух строк, эффект будет тот же самый. Цитата Спишем на глюк QTreeView в SDI У меня пятый кутэ, поэтому всякие могут быть разночтения. Сложно отделить такие детали. |
|
|
JohnZ |
27.11.2014, 23:18
Сообщение
#5
|
Участник Группа: Участник Сообщений: 139 Регистрация: 19.7.2014 Пользователь №: 4190 Спасибо сказали: 10 раз(а) Репутация: 0 |
Почему работало когда ты закрывал диалог: шло обновление и он перебирал все строки. Когда доходил до той которой нет, весь хэш обновлялся и дальше шло все по порядку. Выброси хэш, сразу станет сильно легче Т.е. нужно переработать уже имеющуюся модель, но без использования хэш-а и DomItem * ? Так ? Или ты имел в виду заменить хэш списком ? И по поводу хэша, - DomItem только в хэш-е и хранятся ! По другому как ? Фактически DomItem это "аналог" QTreeViewItem, построенный над QDomNode, который показывает QTreeView. Цитата Цитата А вот тут поподробнее можно ? Имел ввиду QDomNode и сотоварищей. Ты же по сути строишь дублирующую структуру. Может DomItem ? Без дублирующей структуры возможно, если существует модель типа QDirModel но для xml-я. Есть такая ? В 4.5.3 я такой не нашёл, поэтому применил эту. Может в версиях выше есть такая ? Цитата Цитата beginMoveRows - Дык это начиная с 4.6.0. Видимо придётся переходить на 4.6.х Жаль ... Можно просто вызвать dataChanged для этих двух строк, эффект будет тот же самый. Спасибо, переделаю. О результате сообщу. Сообщение отредактировал JohnZ - 28.11.2014, 10:48 |
|
|
lanz |
28.11.2014, 19:22
Сообщение
#6
|
Старейший участник Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: 8 |
Цитата Может DomItem ? Без дублирующей структуры возможно, если существует модель типа QDirModel но для xml-я. Есть такая ? В 4.5.3 я такой не нашёл, поэтому применил эту. Может в версиях выше есть такая ? Вот же она http://doc.qt.digia.com/4.5/qdomnode.html |
|
|
Текстовая версия | Сейчас: 30.11.2024, 1:36 |