谁熟悉QTreeView+QAbstractItemModel 求救

wylove08 2013-05-13 08:47:59
我建立了一个数据库,用类实现的 Database ,该类可以添加子节点, 结构和 分层tree 差不多。

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

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

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

//获取treeview 选择的节点(调试发现 QModelIndexList 排列顺序是以选择的顺序来排列的)

void Remove()
{
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 () ) 删也解决不了。

...全文
394 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ashy1q 2013-05-30
  • 打赏
  • 举报
回复
遇到类似的问题 我使用QListView+QFileSystemModel做文件管理器 添加删除功能 使用方法QModelIndexList selectedList = QtreeView->selectionModel()->selectedIndexes(); 得到的selectedList中会包括所选文件或目录的父目录Index,还有“..”(所选item为目录时包含此项) 楼主可以打印一下selectedList这里面不仅仅是你选择的那几个条目项吧!
wylove08 2013-05-14
  • 打赏
  • 举报
回复
beginRemoveRows( modelIndexParent, modelIndex.row(), modelIndex.row() ); //删除数据结构 endMoveRows() 好像需这样删除才有效。 看help beginRemoveRows 后面2个参数 都是连续节点的。
  • 打赏
  • 举报
回复
我的想法是你的数据存储的是数据的指针,删除时通过索引号先将待删除的数据指针保存在一个临时数组中,然后统一delete该数组记录的指针

16,816

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧