QTableWidget加载大量数据不卡顿解决办法

  • 原因
  • 解决方案
  • 举例说明
  • 重新鼠标事件
  • wheelEvent() 实现方法
  • 事件过滤器
  • eventFilter() 实现方法
  • 实现滑动加载
  • 总结:

最近在模仿网易云音乐的UI,积累自己的代码能力,在使用QTabbleWidget的时候发现加载大量数据会导致卡顿,这个不能忍。

原因

  1. 设置了自适应宽度
 // item 水平表头自适应大小tab->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);// item 垂直表头自适应大小ui->tableWidget->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch);//试着设置为:  QHeaderView::Fixed 看看是否还会卡顿
  1. 加载的数据太大

解决方案

  1. QTableView 配合 Model (推荐)
  2. 我们知道 QTableWidget 每次显示的数据有限(屏幕只有这么大),我们利用这一点来实现动态加载item,解决卡顿的问题
  3. 使用事件过滤器,或者 重写鼠标事件,
 //需要重写的虚函数virtual void wheelEvent(QWheelEvent* event)//事件过滤器virtual bool eventFilter(QObject* obj, QEvent* event)

举例说明

1.我们首先先加载一定量的数据,这样就不会卡了。
2.为了防止越界,每次循环我们都应该判断一下
3.用一个 curtableindex 来记录当前数据的位置,方便之后加载剩余的数据

void SongMenu::loadData()
{int len = taglsit.length();for (int i = 0; i != 20; ++i) {if (i >= len)return;ui->tab_SongTable->insertRow(i);//添加窗口小部件ui->tab_SongTable->setCellWidget(i, 0, base->setItemWidget(1));QTableWidgetItem* item1 = new QTableWidgetItem(taglsit.at(i).Title);QTableWidgetItem* item2 = new QTableWidgetItem(taglsit.at(i).Artist);QTableWidgetItem* item3 = new QTableWidgetItem(taglsit.at(i).Ablue);QTableWidgetItem* item4 = new QTableWidgetItem(taglsit.at(i).Duration);ui->tab_SongTable->setItem(i, 1, item1);ui->tab_SongTable->setItem(i, 2, item2);ui->tab_SongTable->setItem(i, 3, item3);ui->tab_SongTable->setItem(i, 4, item4);}curtableindex = 20;//下面例子是加载大量数据会卡顿,原因:一次性把所有的数据都添加了且设置了自适应宽度/*foreach(const Temptag & rhs, taglsit) {ui->tab_SongTable->insertRow(index);ui->tab_SongTable->setCellWidget(index, 0, base->setItemWidget(1));QTableWidgetItem* item1 = new QTableWidgetItem(rhs.Artist);QTableWidgetItem* item2 = new QTableWidgetItem(rhs.Title);QTableWidgetItem* item3 = new QTableWidgetItem(rhs.Ablue);QTableWidgetItem* item4 = new QTableWidgetItem(rhs.Duration);ui->tab_SongTable->setItem(index, 1, item1);ui->tab_SongTable->setItem(index, 2, item2);ui->tab_SongTable->setItem(index, 3, item3);ui->tab_SongTable->setItem(index, 4, item4);}*/
}


这里并没有加载全部的数据。

重新鼠标事件

函数原型:

virtual void wheelEvent(QWheelEvent* event)

wheelEvent() 实现方法

void Base::wheelEvent(QWheelEvent* event)
{//滑动一次 y() == 120//y() > 0 鼠标滚轮向前滑动, y() < 0 鼠标滚轮向自己滑动if (event->angleDelta().y() < 0) {emit loadNextPage();}
}

事件过滤器

函数原型:

virtual bool eventFilter(QObject* obj, QEvent* event)

eventFilter() 实现方法

bool Base::eventFilter(QObject* obj, QEvent* event)
{if (obj == tab) {if (event->type() == QEvent::Wheel) {QWheelEvent* wheel = static_cast<QWheelEvent*>(event);//y() < 0 鼠标滚轮向自己滑动 if (wheel->angleDelta().y() < 0) {//发射信号,然后处理数据emit loadNextPage(); }}}return QTableWidget::eventFilter(obj,event);
}//然后在 构造函数中安装事件过滤器
ui->tab_SongTable->installEventFilter(this);

实现滑动加载

前面已经实现了事件过滤器,和重写鼠标事件,接下来就是加载数据了,方法很简单,只要连接信号,然后加载数据就行了

 //加载剩余的数据connect(base, &Base::loadNextPage, this, [&]() {//每次滚动到底部都加载5条数据,和前面一样,检查边界,以防越界for (int i = 0; i != 5; i++) {if (curtableindex >= taglsit.length()) {return;}else{//拿到ui->tab_SongTable尾部的索引,之后往尾部添加数据int currow = ui->tab_SongTable->rowCount();ui->tab_SongTable->insertRow(currow);ui->tab_SongTable->setCellWidget(currow, 0, base->setItemWidget(1));QTableWidgetItem* item1 = new QTableWidgetItem(taglsit.at(currow).Title);QTableWidgetItem* item2 = new QTableWidgetItem(taglsit.at(currow).Artist);QTableWidgetItem* item3 = new QTableWidgetItem(taglsit.at(currow).Ablue);QTableWidgetItem* item4 = new QTableWidgetItem(taglsit.at(currow).Duration);ui->tab_SongTable->setItem(currow, 1, item1);ui->tab_SongTable->setItem(currow, 2, item2);ui->tab_SongTable->setItem(currow, 3, item3);ui->tab_SongTable->setItem(currow, 4, item4);}//累加索引,防止越界++curtableindex ;}});

总结:

这里提供了三种解决办法,更具自己的实际情况选择合适的方法,达到自己的目的如果你有更好的解决方案,欢迎分享

QTableWidget加载大量数据不卡顿相关推荐

  1. SPA程序加载首界面eclipse卡顿解决笔记

    最近在开发SPA程序项目时遇到一个问题,因为是在开发阶段,所以直接就在eclipse中启动项目. 每次进入首界面时,eclipse就会长时间卡顿,前端界面也加载不出来,很影响开发效率. 在查找问题的时 ...

  2. vue开发 百度地图 加载大量点导致卡顿解决方法(vue+vue-baidu-map+mapv)

    造成卡顿原因 及解决方法(解释可能有误!!!) 自行通过F12进入调试窗口,可以发现点标注Marker会以div元素在dom树中渲染出来,需要占用的内存大,渲染慢且大规模的 DOM 操作(会造成重绘或 ...

  3. uniapp小程序如何通过虚拟列表配合节流,完成上拉刷新下拉加载,避免页面卡顿,提升性能呢?

    本文将介绍uniapp小程序中如何使用虚拟列表和节流两种技术实现上拉刷新下拉加载功能,同时避免因渲染大量数据导致的页面卡顿问题. 一.虚拟列表 在uniapp小程序开发中,当我们需要渲染大量列表数据时 ...

  4. Android多个fragment懒加载的坑(卡顿)

    在Android开发中,有很多种情况都是viewpage+fragment左右滑动进行布局的,例如下面的今日头条 在今日头条app上,我们可以看到,其顶部都是一栏的类型数据源,可滑动,可联动下面的vi ...

  5. EasyPlayer播放H.265的HLS视频流,ts加载频繁导致浏览器卡顿是什么原因?

    EasyPlayer是可支持H.264/H.265视频播放的流媒体播放器,性能稳定.播放流畅,可支持的视频流格式有RTSP.RTMP.HLS.FLV.WebRTC等,具备较高的可用性.同时还支持大码率 ...

  6. Qt解决UI界面一次性加载数据过多卡顿的问题

    关于Qt如何解决UI界面一次性加载太多数据而卡顿的问题 思路分析: ​ 以QTableWidget电子词典为例,每次模糊查询单词时都会产生几十种,几千甚至上万种不同的结果: ​ 例如我们输入a,对a进 ...

  7. vue渲染大量数据优化_vue大数据表格卡顿问题的完美解决方案

    前言 vue渲染小数据挺快,大数据vue开始出现卡顿现象,本文讲给大家详细介绍关于vue大数据表格卡顿问题的解决方法 亲测苹果电脑,chrome浏览器无卡顿现象,其它浏览器并未测试,如遇到卡顿请备注系 ...

  8. WinForm使用多线程异步加载界面数据

    WinForm使用多线程异步加载界面数据 处于学习阶段,做个记录,如有写错,请多多指教. private void FrmQC111_Load(object sender, EventArgs e) ...

  9. cbitmap 从内存中加载jpg_Pytorch数据加载的分析

    Pytorch数据加载的效率一直让人头痛,此前我介绍过两个方法,实际使用后数据加载的速度还是不够快,我陆续做了一些尝试,这里做个简单的总结和分析. 1.定位问题 在优化数据加载前,应该先确定是否需要优 ...

最新文章

  1. 03-NSPredicate谓词
  2. Rational工具介绍『转』
  3. 从 HTTP 到 HTTP/3 的发展简史
  4. mysql 值到99999后不增值了_MySQL数据库之更新语句精解(一)
  5. dijkstra邻接表_掌握算法-图论-最短路径算法-Dijkstra算法
  6. 使用onnx包将pth文件转换为onnx文件
  7. 开发中常用的一些神器推荐
  8. linux中.开头的变量,linux中的变量
  9. matlab vision hdl,MATLAB下载,MATLAB购买,MATLAB试用,MATLAB介绍,MATLAB评价
  10. backbone js学习笔记之第二篇Model层
  11. linux uuid挂载磁盘_Linux磁盘设备磁盘设备的UUID标识代码(sda,sdb,sdc…)变化的解决办法...
  12. ubuntu-12.04.4-server安装
  13. java调用百度api完成人脸识别
  14. Python 之多元线性回归分析
  15. 简明扼要理解YOLOX
  16. 邮箱密码忘了怎么找回?电子邮箱密码怎么改和填写?
  17. 香农编码C程序及演示结果
  18. 平价无线充电宝哪个牌子好?平价好用的无线充电宝推荐
  19. 使用AI制作 3d 模型初学者指南,如何在 Blender 3d 中使用stable diffusion
  20. SDKS企业级区块链应用平台

热门文章

  1. 适合苹果平板的思维导图软件有哪些
  2. RocketMQ—(总结)一篇就搞懂RocketMQ
  3. 免越狱,新版苹果分身双开教程!全系统适用,速薅
  4. 云雷服务器崩溃,“云雷崩”再现,张云雷登杂志封面,服务器被粉丝挤爆
  5. 设置 Sidecar
  6. 京东联盟-怎么跳转到京东购物小程序领券下单
  7. uniapp的H5端之微信JsSdk的开放标签以及Api使用心得
  8. 黑马程序员--银行调度系统
  9. react hook父组件调用子组件方法
  10. SnowFlake 雪花算法详解与实现