最近项目遇到一个问题,qtableview刷新后需要将之前选中项继续保持选中状态,我使用的view+model,起初我想到的方法是在刷新数据前获取到已经选中的行,然后在数据刷新之后再将选中的行赋值上
代码如下:
m_pDeployListTableView->setSelectionMode(QAbstractItemView::MultiSelection); //多选模式
for(int i=0;i<list.size();++i)
{
m_pDeployListTableView->selectRow(list[i]); //这个速度非常慢 需要20ms执行一次,且越往后越慢
}
m_pDeployListTableView->setSelectionMode(QAbstractItemView::ExtendedSelection);
这个虽说能解决问题了,但是问题就在于数据量起来了就会非常卡顿。如我900条数据,他选中需要18秒左右,这对于客户来说是致命的。于是经过我的再三摸索,发现我每次刷新模型都是使用的beginResetModel和endResetModel,这会将原有的选中项清除掉。
代码如下
beginResetModel();
modelData.clear();
modelData = model;
endResetModel();
起始当行数不变的情况下,可以使用dataChanged这个信号,来进行刷新列表。而我恰恰是不需要更改数量,所以使用这个方法完美解决我的问题。
代码如下:
modelData = model;
emit dataChanged(index(0, 0), index(rowCount() - 1, columnCount() - 1), QVector<int>());
//rowCount为总行数,columnCount为总列数
若数据行数每次都在变动,我还想到了一种方法,选中嘛,其实无非就是改变item的背景色,所以我更改item的背景色应该也是可以的。更改data函数中的代码:
if (role == Qt::BackgroundColorRole)
{
for(int i=0;i<rowCount();++i)
{
for(int j=0;j<columnCount();++j)
{
return QColor(Qt::blue); //选中颜色为蓝色
}
}
}
第三种方法我自己没有试过,但是绝对是可行的,速度可以自己去试下。
ヾ(•ω•`)o