c++ - Qt AbstractItemModel removeRows 和删除原因核心

标签 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. 如果鼠标悬停在被删除的行上,立即进行核心转储。

如果我不删除p_node。一切运行良好。但显然这会造成内存泄漏。 我究竟做错了什么?

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

最佳答案

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

看来是问题所在

检查在 QStandardItemModel 中是如何完成的

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

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

关于c++ - Qt AbstractItemModel removeRows 和删除原因核心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17559446/

相关文章:

c++ - 链接内联虚方法

qt - 在 dropEvent 中删除 QFrame 子类时,内部 QMutex::lock 崩溃

qt - QWidgets 移动时会发出信号吗?

python - QT 消失第二个窗口

Qt:如何生成带有调试信息的可执行文件?

python - 当没有任何选项卡时,cornerWidget 会消失

c++ - 叮当查询 : Examining name of template parameter of a function argument's type

c++ - 如何在 Microsoft visual C++ ( MFC ) 中处理特定控件的鼠标悬停事件?

c++ - 在 C++ 中验证出生日期

c++ - C 和 C++ : data file with error "Expected unqualified-id"