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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как удалять данные из иерархической модели без утечек памяти?  (Прочитано 3401 раз)
nvek
Гость
« : Апрель 25, 2017, 14:21 »

StatTreeCtrl унаследован от абстракттеммодел
Пропустим индексы, дата, парент...
во вьюшке видна XML.
В тыкаю на заголовок Xml жму удалить:
Код:
QModelIndex index = treeView->currentIndex();
StatisticItem* item = static_cast<StatisticItem*> (index.internalPointer());

QMessageBox::StandardButton reply;
reply = QMessageBox::question(this, Resource::CLOSE_DOCUMENT_TITLE, Resource::CLOSE_DOCUMENT,
QMessageBox::Yes | QMessageBox::No);
if (reply == QMessageBox::Yes)
{
_rootItem.removeChild(item);
}

Код:
void StatisticItem::removeChild(StatisticItem * item)
{
int index = m_childItems.indexOf(item);
if (index == -1)
return;
emit sg_Removed(item, index);

}


Код:

void StatTreeCtrl::sl_ItemRemoved(StatisticItem *item, int index)
{
removeRows(index, item->children().count() ,QModelIndex()); //children - vector<StatisticItem*>
}

Код:
bool StatTreeCtrl::removeRows(int row, int count, const QModelIndex& parent)
{
if (row < 0 || row + count > rowCount(parent) || count == 0)
return false;

StatisticItem* item = static_cast<StatisticItem*>(parent.internalPointer());
beginRemoveRows(parent, row, count + row - 1);
for (int i = 0; i < count; i++)
{
item->deleteChild(row);
}
endRemoveRows();
return true;
}

Код:
void StatisticItem::deleteChild(int row)
{


//m_childItems[row];
if (item)
delete item;
m_childItems.removeAt(row);
}

какая то лапша


Код:
StatisticItem::~StatisticItem()
{
qDeleteAll(m_childItems);
m_childItems.clear();
}

Код:
StatTreeCtrl::~StatTreeCtrl()
{
if (rootItem)
delete rootItem;
}
« Последнее редактирование: Апрель 25, 2017, 14:23 от nvek » Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #1 : Апрель 25, 2017, 15:31 »

Кажись, для удаления нужно вызывать removeRow, которая будет вызывать StatTreeCtrl::removeChild, а та удалит внуков. Вьюха сама должна всё обработать по endRemoveRows

Код
C++ (Qt)
if (rootItem)
delete rootItem;
Спокойно можно менять на
Код
C++ (Qt)
delete rootItem;

Взгляните на пример http://www.prog.org.ru/topic_31100_0.html , возможно будет полезен
Записан
nvek
Гость
« Ответ #2 : Апрель 26, 2017, 05:57 »

Спасибо за пример, у тебя там оказывается умные указатели, может тоже стоит попробовать...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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