Qt AbstractItemModel删除行并删除原因核心
Qt AbstractItemModel removeRows and delete causes core
我要插入以下节点:
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。
append和remove-children方法是否更新rowCount?
这似乎是个问题。
检查如何在QStandardItemModel 中完成
更新rowcount应该可以解决3个问题,而无需更新持久索引:
- 如果rowcount未更新,则所选项目更改为之前插入的,即索引所指向的位置,这是正常的
- &3.索引指向已删除的项
要修复崩溃,您应该使用deleteLater而不是delete,这样您的视图就不会在尝试访问无效对象时死亡。
所选项目似乎是索引问题。看起来缺少要查看的通知。
到第1点:可能是
model->blockSignals(true);
...
model->blockSignals(false);
将修复该选择行为。
我想选定的索引/行将具有从框架中调用的一些函数。因此,如果它们被删除,就会导致崩溃。如果要删除它们,请将所选内容设置为另一行/索引,它应该运行良好…'
如果您将鼠标悬停在已删除的行上。。。如果行应该是空的,为什么不将文本设置为空呢?
相关文章:
- 将数组的地址分配给变量并删除
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C/C++编译器通常会删除重复的库吗
- 从链接列表c++中删除一个项目
- C++如何通过用户输入删除列表元素
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 是否需要删除包含对象的"pair"?
- 如何找出GDB的SIGTRAP核心转储的根本原因
- C++映射分割错误(核心转储)
- 为什么使用删除会导致核心转储
- 在删除函数自由度的指针后,为什么我会得到核心转储
- 为什么此删除会导致核心转储
- 删除导致的分段错误(核心转储)
- 是否可以从 ELF 核心文件中删除堆
- Qt AbstractItemModel删除行并删除原因核心
- 删除指针C++时的核心转储
- 删除指针时出现分段错误(核心转储)
- 是否有可能调试最初由可执行文件生成的已删除符号的核心文件?
- 在使用 memcpy 填充动态 2d 数组后删除动态 2D 数组时中止(核心转储)
- 查找并删除目录中的所有核心文件