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

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

加油小杜(接qt定制功能,单模块开发等)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值