我有以下插入节点:
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。
答案 0 :(得分:1)
要修复崩溃,您应该使用deleteLater而不是删除,这样您的视图就不会因尝试访问无效对象而死亡。
所选项似乎是索引问题。看起来它缺少要查看的通知。
答案 1 :(得分:1)
请追加和删除子方法更新rowCount吗?
这似乎是问题所在。
中的工作方式更新rowcount应该解决3个点而不必更新持久性索引:
答案 2 :(得分:0)
指向第1点:也许
model->blockSignals(true);
...
model->blockSignals(false);
将修复该选择行为。
我猜选择的索引/行将具有从框架调用的一些函数。所以如果删除它们会导致崩溃。如果你想删除它们,将选择设置为另一行/索引,它应该运行良好...'
如果你将鼠标移到已删除的行上......如果该行应该只是空的,为什么不将文本设置为空?