Russian Qt Forum

Qt => Model-View (MV) => Тема начата: nvek от Апрель 25, 2017, 14:21



Название: Как удалять данные из иерархической модели без утечек памяти?
Отправлено: 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;
}


Название: Re: Как удалять данные из иерархической модели без утечек памяти?
Отправлено: __Heaven__ от Апрель 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 , возможно будет полезен


Название: Re: Как удалять данные из иерархической модели без утечек памяти?
Отправлено: nvek от Апрель 26, 2017, 05:57
Спасибо за пример, у тебя там оказывается умные указатели, может тоже стоит попробовать...