qtableview结合QAbstractTableModel处理数据刷新后保存原有选中项卡顿问题解决方案

最近项目遇到一个问题,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

你可能感兴趣的:(Qt,qt,开发语言,qtableView)