crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Проблемы редактирования 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);
Для добавления и удаления поля в модели есть соотв-щие ф-ции
    beginInsertRows(parent, position, position + rows - 1);   // !!!
    success = parentItem->insertChildrens(position, rows);
    endInsertRows();      // !!!

и
    beginRemoveRows(parent, position, position + rows - 1);   // !!!
    success = parentItem->removeChildrens(position, rows);
    endRemoveRows();   // !!!

Но в модели нет функций
beginSwapRows(parent, position, position + 1);
endSwapRows();
Как это можно реализовать (с отображением в TreeView-e), как в случае с удалением ?

3. Почему при открытии диалога, строка выбора в TreeView-e скачет хз куда ?
Странно это потому, что в оригинальном проекте, когда TreeView является
MdiChild-ом, такого не наблюдается ... Это так, из спортивного интереса :-)

Заранее благодарен за помощь.

Прикрепленные файлы
Прикрепленный файл  simpledommodel.zip ( 195,06 килобайт ) Кол-во скачиваний: 210
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
lanz
  опции профиля:
сообщение 26.11.2014, 22:13
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


1. Хэш никак с этим не связан. У меня все удаляется даже если закоментарить clear()
Память течет, именно потому что вы сказали.
Уберите хэш вообще, насовсем. Здесь он не нужен пока, только все запутывает.
Утекает вот отсюда:
    if (i >= 0 && i < domNode.childNodes().count()) {
        QDomNode childNode = domNode.childNodes().item(i);
        DomItem *childItem = new DomItem(childNode, i, this);
        childItems[i] = childItem;
        return childItem;
    }


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

2. http://qt-project.org/doc/qt-4.8/qabstract...l#beginMoveRows
Или можете просто вызвать dataChanged для обоих строк после того как поменяете их внутри своей модели.

3. У меня все работает :lol: Не скачет.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 30.11.2024, 0:56