Qt AbstractItemModel删除行并删除原因核心

Qt AbstractItemModel removeRows and delete causes core

本文关键字:核心 删除 AbstractItemModel 删除行 Qt      更新时间:2023-10-16

我要插入以下节点:

  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;

它有效。我可以添加节点和删除节点。

术语注释:我交替使用nodesrows。很抱歉造成任何混淆。

什么不起作用:

  1. 如果在选定节点前面插入新行。新插入的节点变为选中。[这不是我所期望的。]
  2. 如果选择了一行,然后删除了该行,则立即转储堆芯
  3. 如果鼠标悬停在已删除的行上,则立即转储核心

如果我不删除p_node。一切都很顺利。但很明显,这会造成内存泄漏。我做错了什么?

作为参考,我在64位Linux上使用QT 5.0.2。

append和remove-children方法是否更新rowCount?

这似乎是个问题。

检查如何在QStandardItemModel 中完成

更新rowcount应该可以解决3个问题,而无需更新持久索引:

  1. 如果rowcount未更新,则所选项目更改为之前插入的,即索引所指向的位置,这是正常的
  2. &3.索引指向已删除的项

要修复崩溃,您应该使用deleteLater而不是delete,这样您的视图就不会在尝试访问无效对象时死亡。

所选项目似乎是索引问题。看起来缺少要查看的通知。

到第1点:可能是

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

将修复该选择行为。

我想选定的索引/行将具有从框架中调用的一些函数。因此,如果它们被删除,就会导致崩溃。如果要删除它们,请将所选内容设置为另一行/索引,它应该运行良好…'

如果您将鼠标悬停在已删除的行上。。。如果行应该是空的,为什么不将文本设置为空呢?