qt model删除选中的记录异常问题

Thinkvd开发日志

参考:http://www.java2s.com/Code/Cpp/Qt/QTreeViewdraganddrop.htm

class TreeModel : public QAbstractItemModel

实现的Model类似上面的,但在删除选中的记录时,当记录同时中包括子节点、父节点,由于可能先删除父节点,造成在删除子节点时异常。
类似下面的图(全部选中状态):
qt model删除选中的记录异常问题_第1张图片
bool ImListTreeModel::removeRows(const QModelIndexList &list)
{
bool bRet = false;
//foreach(QModelIndex index, list)
for(int i=list.count()-1; i>=0; i-- ) //需要反向删除,否则出现异常
{
QModelIndex index = list.at(i);
qDebug() << index.parent();
if (!(bRet = removeRow(index.row(), index.parent())))
{
LOGFILE(("removeRow false"), ("removeRow false"));
}
// else cont
}


return bRet;
}

const QModelIndexList &list为选中要删除的记录集,在删除上面的带子节点时,由于可能先删除AA2,造成再删除AAA1时异常.

实现思路先保存带子节点的记录(非QModelIndex),再删除叶节点,然后找到带子节点的记录的Index以实现递归删除.

原因是删除item后,兄弟节点的Index会改变。

// first remove last node;
// then parent;
bool ImListTreeModel::removeRows(const QModelIndexList &list)
{
bool bRet = false;
QList<ImListTreeItem *>items;


for(int i=list.count()-1; i>=0; i-- ) 
{
QModelIndex index = list.at(i);
QModelIndex child = index.child(0, 0);
if (child.isValid()  && list.count()>1){ //只选中部分子节点
items << getItem(index);
continue;
}
if (!(bRet = removeRows(index.row(), 1, index.parent())))
{
LOGFILE(("removeRow false"), ("removeRow false"));
}
// else cont
}
QModelIndexList ls;
foreach(ImListTreeItem *item, items){
ls << getItemIndex(item);
}
if (ls.count() > 0) removeRows(ls); //递归删除

return bRet;
}

你可能感兴趣的:(qt model删除选中的记录异常问题)