Qt AbstractItemModel removeRows和delete导致核心

时间:2013-07-09 22:36:19

标签: c++ qt

我有以下插入节点:

  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. 如果将鼠标悬停在已删除的行上,则立即进行核心转储。
  4. 如果我不删除p_node。一切都运行良好。但显然会造成内存泄漏。 我究竟做错了什么?

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

请追加和删除子方法更新rowCount吗?

这似乎是问题所在。

检查QStandardItemModel

中的工作方式

更新rowcount应该解决3个点而不必更新持久性索引:

  1. 如果没有更新rowcount,那么选择的项目会更改为之前插入的索引是正常的,这是索引指向的位置。
  2. &安培; 3.索引指向已删除的项目。

答案 2 :(得分:0)

指向第1点:也许

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

将修复该选择行为。

我猜选择的索引/行将具有从框架调用的一些函数。所以如果删除它们会导致崩溃。如果你想删除它们,将选择设置为另一行/索引,它应该运行良好...'

如果你将鼠标移到已删除的行上......如果该行应该只是空的,为什么不将文本设置为空?