2013-07-09 2 views
3

У меня есть следующие вставить узлы: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 взаимозаменяемо. Извините за любую путаницу.

Что не работает:

  1. Если новая строка вставляется перед выбранным узлом. Вновь выбран новый узел . [Это не то, чего я ожидаю от нужды.]
  2. Если строка выбрана, а затем удалена, немедленно дамп ядра.
  3. Если мышь над удаляемой строкой, немедленно дамп ядра.

Если я не удаляю p_node. Все работает нормально. Но, очевидно, это создает утечку памяти. Что я делаю неправильно?

Для справки Я использую QT 5.0.2 на 64-разрядной Linux.

+0

Запустите его в отладчике и просмотрите трассировку ошибки стека. –

+0

@ Riateche Я сделал это. Столбец показывает, что он сбой, когда size() вызывается в QList, который находится внутри TreeNode. Этот вызов size() выполнен из QTree, пытаясь нарисовать себя и получить доступ к модели. – anio

ответ

1

Как добавить и удалить дочерние методы, обновить rowCount?

Кажется, проблема.

Проверьте, как это делается в QStandardItemModel

Обновление ROWCOUNT должны решить 3 очка без необходимости обновлять постоянные показатели:

  1. Если ROWCOUNT не обновляется, это нормально, что выбранный элемент изменяется на вставленный before, где указывает указатель.
  2. & 3. Индексы указывают на удаленный элемент.
0

к точке 1: может быть

model->blockSignals(true); 
... 
model->blockSignals(false); 

зафиксирует, что поведение выбора.

Я думаю, что выбранные индексы/строки будут иметь некоторые функции, вызываемые из фреймворка. поэтому, если они удалены, они приводят к сбою. если вы хотите удалить их, установите выделение в другую строку/индекс, и он должен работать нормально ... »

Если вы нажмете на удаленную строку« ... если строка должна быть пустой, почему бы не установить текст пуст?

+0

Я имею в виду, если у меня есть мышь над строкой, поскольку она удаляется. – anio

1

Чтобы исправить ошибки, вы должны использовать deleteLater вместо удаления, поэтому ваш взгляд не умрет при попытке доступа к недопустимым объектам.

Выбранный элемент кажется проблемой индекса. Похоже, что отсутствует уведомление для просмотра.

+0

TreeNode не является объектом QT. Он не получает сигналов. – anio

Смежные вопросы