我有以下插入节点:
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
。一切运行良好。但显然这会造成内存泄漏。
我究竟做错了什么?
作为引用,我在 64 位 Linux 上使用 QT 5.0.2。
最佳答案
追加和删除子方法会更新 rowCount 吗?
看来是问题所在
检查在 QStandardItemModel 中是如何完成的
更新 rowcount 应该解决 3 点而无需更新持久索引:
- 如果 rowcount 没有更新,则所选项目更改为之前插入的是正常的,它是索引指向的位置。
- & 3. 索引指向已删除的项目。
关于c++ - Qt AbstractItemModel removeRows 和删除原因核心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17559446/