1,简介

在使用QTreeView展示数据的时候,有些数据是在动态变化的,
这时候也需要动态刷新界面,一般直接更新model即可。
但是存在一个问题:之前的选中状态会丢失。
本文讨论在更新数据时如何处理选中状态。

2,两种情况

情况一:更新数据后,需选中同样内容的行。
比如:之前有3行,每行内容为a/b/c,选中了第1行a。现在更新后有5行,x/y/a/b/c,更新后要求仍然选中a,即第3行。
适用情况:软件其他地方与QTreeView里的选中内容有对应关系。所以这个选中行的具体内容不能变,不然无法对应。
解决办法:记录选中行的可唯一识别的data,在刷新后逐行判断,在记录内的就选中。

情况二:更新数据后,需选中同样位置的行。
比如:之前有3行,每行内容为a/b/c,选中了第1行a。现在更新后有5行,x/y/a/b/c,更新后要求仍然选中第1行,即x。
解决办法:记录选中行的index,刷新后设置该index即可,如果刷新后的数据不存在该index那么设置会失败,不用管。

3,代码

对于情况二,存储每行index,然后设置index。
示例代码:

//获取更新之前的所有选中行索引
QModelIndexList selected = ui->treeView->selectionModel()->selectedIndexes();

//清除所有行
mModel->removeRows(0,mModel->rowCount());
//更新数据
InitTreeModel();

//重设索引为之前的位置
if(!selected.isEmpty())
{
foreach(const QModelIndex& index, selected)
{
ui->treeView->selectionModel()->select(index,QItemSelectionModel::Select | QItemSelectionModel::Rows);
}
}

对于情况一,存储每行一个具体的key值。然后在更新数据后遍历每行比较key值,存在就加入新的选中索引。
代码类似,可自行实现。