• 7654阅读
  • 9回复

谁熟悉QTreeView+QAbstractItemModel 多选删除功能 [复制链接]

上一主题 下一主题
离线wylove08
 

只看楼主 倒序阅读 楼主  发表于: 2013-05-14
我建立了一个数据,用类实现的  Database ,该类可以添加子节点, 结构和 分层tree 差不多。

然后建立了一个TreeModel: public QAbstractItemModel  ,TreeModel->setDatabase( Database );

QTreeView->setModel( TreeModel  );显示正常 。  TreeModel:  data、setdata、rowcount、 index 、columnCount、flags 、parent  该实现的函数都实现了

现在想实现 多选删除, 以下大概代码:

void Remove()
{
//获取treeview 选择的节点(调试发现 QModelIndexList  排列顺序是以选择的顺序来排列的)
QModelIndexList selectedList = QtreeView->selectionModel()->selectedIndexes();

QListIterator<QModelIndex> i(selectedList);
while (i.hasNext())
{
    QModelIndex modelIndex = i.next();
    QModelIndex modelIndexParent = modelIndex.parent()

    //子节点内部指针
    Database* database = static_cast<Database*>(modelIndex.internalPointer () )

    //父节点内部指针
    Database* databaseParent = static_cast<Database*>(modelIndexParent.internalPointer () )

//开始删除
//一次只删除1个,没法连着删除,因为多选不是连着选的。
beginRemoveRows( modelIndexParent, modelIndex.row(), modelIndex.row() );

//删除数据结构
DatabaseSourceParent->ChildList().removeOne( Database );

endMoveRows()


}

}
现在的问题是 QModelIndexList selectedList 获取的顺序是选中顺序,我这循环先删除前面的QModelIndex,后面的QModelIndex变了,导致有问题,即时我用 倒叙( hasPrevious () ) 删也解决不了。
离线wylove08

只看该作者 1楼 发表于: 2013-05-14
求救
离线wylove08

只看该作者 2楼 发表于: 2013-05-14
求救
离线wylove08

只看该作者 3楼 发表于: 2013-05-14
这怎么发成这样的  汗
离线wylove08

只看该作者 4楼 发表于: 2013-05-14
我建立了一个数据库,用类实现的  Database ,该类可以添加子节点, 结构和 分层tree 差不多。

然后建立了一个TreeModel: public QAbstractItemModel  ,TreeModel->setDatabase( Database );

QTreeView->setModel( TreeModel  );显示正常 。  TreeModel:  data、setdata、rowcount、 index 、columnCount、flags 、parent  该实现的函数都实现了

现在想实现 多选删除, 以下大概代码:

void Remove()
{
//获取treeview 选择的节点(调试发现 QModelIndexList  排列顺序是以选择的顺序来排列的)
QModelIndexList selectedList = QtreeView->selectionModel()->selectedIndexes();

QListIterator<QModelIndex> i(selectedList);
while (i.hasNext())
{
    QModelIndex modelIndex = i.next();
    QModelIndex modelIndexParent = modelIndex.parent()

    //子节点内部指针
    Database* database = static_cast<Database*>(modelIndex.internalPointer () )

    //父节点内部指针
    Database* databaseParent = static_cast<Database*>(modelIndexParent.internalPointer () )

//开始删除
//一次只删除1个,没法连着删除,因为多选不是连着选的。
beginRemoveRows( modelIndexParent, modelIndex.row(), modelIndex.row() );

//删除数据结构
DatabaseSourceParent->ChildList().removeOne( Database );

endMoveRows()


}

}
离线ppdayz

只看该作者 5楼 发表于: 2013-05-14
多选的时候在data中做个标记,然后遍历一遍,把有标记的都删了就好了
离线wylove08

只看该作者 6楼 发表于: 2013-05-14
在哪遍历? 遍历  QModelIndexList selectedList = QtreeView->selectionModel()->selectedIndexes();

还是遍历 整个 treeview

多选时给data做标记, 是在 QAbstractItemModel::data 做吗?

能给个具体点行不? 谢谢
离线ppdayz

只看该作者 7楼 发表于: 2013-05-14
回 6楼(wylove08) 的帖子
仔细看了下你的代码,整个流程没有什么问题,你遇到了什么问题么?
离线wylove08

只看该作者 8楼 发表于: 2013-05-15
不好意思,贴漏了

现在的问题是 QModelIndexList selectedList 获取的顺序是选中顺序,我这循环先删除前面的QModelIndex,后面的QModelIndex变了,导致有问题,即时我用 倒叙( hasPrevious () ) 删也解决不了。
离线uidab

只看该作者 9楼 发表于: 2013-05-16
回 8楼(wylove08) 的帖子
这个必须倒叙删除。
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
快速回复
限100 字节
 
上一个 下一个