3

我有以下插入节点:

  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。

4

3 回答 3

1

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

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

于 2013-07-10T09:00:14.310 回答
1

追加和删除子方法是否会更新 rowCount?

这似乎是问题所在。

检查如何在QStandardItemModel中完成

更新行数应该解决 3 点,而无需更新持久索引:

  1. 如果没有更新行数,则选定项更改为之前插入的项是正常的,它是索引指向的位置。
  2. & 3. 索引指向已删除的项目。
于 2013-07-10T10:13:23.933 回答
0

第1点:也许

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

将修复该选择行为。

我猜选定的索引/行将有一些从框架调用的函数。所以如果它们被删除,它们会导致崩溃。如果要删除它们,请将选择设置为另一行/索引,它应该可以正常运行...'

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

于 2013-07-10T05:49:09.403 回答