У меня есть следующие вставить узлы:Qt AbstractItemModel removeRows и удаление причины ядра
layoutAboutToBeChanged();
beginInsertRows(createIndex(p_parent->row(), 0, p_parent), start, end);
TreeNode* p_node = new TreeNode(p_parent, p_data);
p_parent->appendChild(start, p_node);
endInsertRows();
layoutChanged();
И удалить строки:
layoutAboutToBeChanged();
beginRemoveRows(createIndex(p_parent->row(), 0, p_parent), row, row);
p_parent->removeChildren(row, row+1, this);
endRemoveRows();
layoutChanged();
Когда removeChildren
вызывается для каждого узла, который удаляется следующее :
changePersistentIndex(createIndex(p_node->row(), 0, p_node), QModelIndex());
delete p_node;
Он работает. Я могу добавлять узлы и удалять узлы.
Терминология ПРИМЕЧАНИЕ: Я использую nodes
и rows
взаимозаменяемо. Извините за любую путаницу.
Что не работает:
- Если новая строка вставляется перед выбранным узлом. Вновь выбран новый узел . [Это не то, чего я ожидаю от нужды.]
- Если строка выбрана, а затем удалена, немедленно дамп ядра.
- Если мышь над удаляемой строкой, немедленно дамп ядра.
Если я не удаляю p_node
. Все работает нормально. Но, очевидно, это создает утечку памяти. Что я делаю неправильно?
Для справки Я использую QT 5.0.2 на 64-разрядной Linux.
Запустите его в отладчике и просмотрите трассировку ошибки стека. –
@ Riateche Я сделал это. Столбец показывает, что он сбой, когда size() вызывается в QList, который находится внутри TreeNode. Этот вызов size() выполнен из QTree, пытаясь нарисовать себя и получить доступ к модели. – anio