我在子类QAbstractItemModel中显示QTreeView中的项,在这个子类(projectModel)中,我有一个函数来删除树视图中当前选定的索引。Component是用来表示模型所有成员的类:
void
projectModel::deleteComponent()
{
QModelIndex child_index = _treeview->selectionModel()->currentIndex();
Component* child = static_cast<Component*>(child_index.internalPointer());
Component* parent = child->Parent();
QModelIndex parent_index = createIndex(parent->row(), 0, parent);
int row = child->row();
beginRemoveRows(parent_index, row, row);
parent->delete_child(child);
endRemoveRows();
}父和子指示符和原始指针在调用beginRemoveRows之前是好的;调试器显示它们指向正确的项及其父项。但是,程序在调用beginRemoveRows后崩溃。具体来说,它在projectModel::parent()中崩溃。
QModelIndex
projectModel::parent(const QModelIndex &index) const
{
if (!index.isValid())
return QModelIndex();
Component* item = getItem(index); //Fails to cast index internal pointer to a valid Component*
Component* parentItem = item->Parent();
if (parentItem == _rootnode)
return QModelIndex();
return createIndex(parentItem->row(), 0, parentItem);
}当我中断崩溃并检查调试器输出时,它会显示parent()函数中的变量parent()是垃圾。不知怎么的,我的QModelIndex在调用deleteComponent和调用parent之间似乎被破坏了。我正在做的事情有什么明显的错误吗?还是问题可能更微妙?
发布于 2015-07-22 17:43:09
这是完全可以预料到的。
在更改模型的结构之前,非持久性索引是有效的。结构更改是指通过发射dataChanged以外发出信号的任何更改。
结构更改必须被视为索引生存期的障碍:必须丢弃任何在结构更改之前保存的非持久性索引。
取决于调用deleteComponent的位置,可能发生的情况是调用方持有一些索引,deleteComponent使它们都无效,从那时起,您将处于未定义的行为领域。
如果希望持久性索引在结构更改中仍然有效,则需要使用持久索引,即使这样,它们也只有在给定项仍然存在的情况下才有效。如果使用自己的模型,则需要显式支持持久索引,模型的用户必须使用它们。
https://stackoverflow.com/questions/31569424
复制相似问题