前面已经写过2篇关于qtableiwdget的优化的内容了,有感兴趣的可以访问我的主页进行查看,但前面写的或多或少都存在一些问题。
这次写的相对于前面2次优化性能有所提升,并且功能更完善,但有一个问题始终无法避免,就是你把你的大数据文件读入内存中,内存是肯定会增大的。当然,你可以使用qt的内存映射来解决此问题,本篇文章,博主并没有使用内存映射。顺便简介下,内存映射就是把你的硬盘当做内存。
话不多说,直接看代码吧:
自定义scrollbar
scrollbar.h:

#ifndef SCROLLBAR_H
#define SCROLLBAR_H#include <QWidget>
#include <qscrollbar.h>class ScrollBar : public QScrollBar
{Q_OBJECT
public:explicit ScrollBar(QWidget *parent = nullptr);protected:void mouseReleaseEvent(QMouseEvent *e);signals:void sSendValue(float);public slots:void onValueChanged(int i_value);private:float m_Value;
};#endif // SCROLLBAR_H
scrollbar.cpp
#include "scrollbar.h"ScrollBar::ScrollBar(QWidget *parent) : QScrollBar(parent)
{this->setOrientation(Qt::Vertical);connect(this,&QScrollBar::valueChanged,this,&ScrollBar::onValueChanged);
}
void ScrollBar::mouseReleaseEvent(QMouseEvent *e)
{emit sSendValue(m_Value);
}void ScrollBar::onValueChanged(int i_value)
{m_Value=float(i_value)/float(this->maximum()); //比例
}

自定义tablewidget:
tablewidget.h

#ifndef TABLEWIDGET_H
#define TABLEWIDGET_H#include <QWidget>
#include <QTableWidget>
#include "scrollbar.h"static const char* DefQSReceiverInfoTableSize[20][3] =
{{"ID" , "130", "0"},{"Line" , "110", "0"},{"Point" , "110", "0"},{"Index" , "60", "0"},{"Type" , "60", "0"},{"X" , "120", "0"},{"Y" , "120", "0"},{"Z" , "120", "0"},{"Lat.-084" , "180", "0"},{"Long.-084" , "180", "0"},{"Elav.-84" , "180", "0"},{"Status" , "100", "0"},{"Point Depth" , "120", "0"},{"Water Depth" , "120", "0"},{"Seis Datum" , "150", "0"},{" " , "150", "0"},{" " , "150", "0"},{" " , "150", "0"},{" " , "150", "0"}
};class TableWidget : public QTableWidget
{Q_OBJECT
public:explicit TableWidget(QWidget *parent = nullptr);~TableWidget();void CreateFirstData();void ClearAllRow();void DownLoadData();void UpLoadData();protected:void wheelEvent(QWheelEvent *event);signals:public slots:void onValueChanged(float i_value);
private:QList<QByteArray> m_strList;QList<QByteArray> m_strFirstList;int m_CurrentRow=0;int m_Size=0;ScrollBar *m_pScrollBar=nullptr;
};#endif // TABLEWIDGET_H

tablewidget.cpp

#include "tablewidget.h"
#include <QFile>
#include <qdebug.h>
#include <QScrollBar>
#include <QWheelEvent>TableWidget::TableWidget(QWidget *parent) : QTableWidget(parent)
{this->setColumnCount(15);QStringList headerList;for(int i=0;i<15;i++){headerList.append(QString::fromLocal8Bit(DefQSReceiverInfoTableSize[i][0]));}this->setHorizontalHeaderLabels(headerList);m_pScrollBar=new ScrollBar(this);this->setVerticalScrollBar(m_pScrollBar);connect(m_pScrollBar,&ScrollBar::sSendValue,this,&TableWidget::onValueChanged);QFile file("C:/Users/dujia/Desktop/aaa.txt");if (!file.open(QIODevice::ReadOnly | QIODevice::Text))return;while (!file.atEnd()) {QByteArray line = file.readLine();m_strList.append(line);if(m_strList.size()==500){m_strFirstList=m_strList;m_Size=m_strFirstList.size();CreateFirstData();}}qDebug()<<"scrollbar::"<<this->verticalScrollBar()->maximum();
}TableWidget::~TableWidget()
{}void TableWidget::CreateFirstData()
{if(m_strFirstList.size()!=0){this->setRowCount(m_strFirstList.size());for(int i=0;i<m_strFirstList.size();i++){QString str=m_strFirstList[i];QStringList strList=str.split("&");this->setItem(i,0,new QTableWidgetItem(strList[0]));this->setItem(i,1,new QTableWidgetItem(strList[1]));this->setItem(i,2,new QTableWidgetItem(strList[2]));this->setItem(i,3,new QTableWidgetItem(strList[3]));this->setItem(i,4,new QTableWidgetItem(strList[4]));this->setItem(i,5,new QTableWidgetItem(strList[5]));this->setItem(i,6,new QTableWidgetItem(strList[6]));this->setItem(i,7,new QTableWidgetItem(strList[7]));this->setItem(i,8,new QTableWidgetItem(strList[8]));this->setItem(i,9,new QTableWidgetItem(strList[9]));this->setItem(i,10,new QTableWidgetItem(strList[10]));}}}void TableWidget::ClearAllRow()
{for(int i=this->rowCount();i>=0;i--){this->removeRow(i);}
}void TableWidget::DownLoadData()
{this->setRowCount(500);int K=0;for(int i=m_CurrentRow;i<m_CurrentRow+500;i++){QString str=m_strList[i];QStringList strList=str.split("&");this->setItem(K,0,new QTableWidgetItem(strList[0]));this->setItem(K,1,new QTableWidgetItem(strList[1]));this->setItem(K,2,new QTableWidgetItem(strList[2]));this->setItem(K,3,new QTableWidgetItem(strList[3]));this->setItem(K,4,new QTableWidgetItem(strList[4]));this->setItem(K,5,new QTableWidgetItem(strList[5]));this->setItem(K,6,new QTableWidgetItem(strList[6]));this->setItem(K,7,new QTableWidgetItem(strList[7]));this->setItem(K,8,new QTableWidgetItem(strList[8]));this->setItem(K,9,new QTableWidgetItem(strList[9]));this->setItem(K,10,new QTableWidgetItem(strList[10]));K=K+1;}
}void TableWidget::UpLoadData()
{this->setRowCount(500);int K=0;for(int i=m_CurrentRow;i<m_CurrentRow+500;i++){QString str=m_strList[i];QStringList strList=str.split("&");this->setItem(K,0,new QTableWidgetItem(strList[0]));this->setItem(K,1,new QTableWidgetItem(strList[1]));this->setItem(K,2,new QTableWidgetItem(strList[2]));this->setItem(K,3,new QTableWidgetItem(strList[3]));this->setItem(K,4,new QTableWidgetItem(strList[4]));this->setItem(K,5,new QTableWidgetItem(strList[5]));this->setItem(K,6,new QTableWidgetItem(strList[6]));this->setItem(K,7,new QTableWidgetItem(strList[7]));this->setItem(K,8,new QTableWidgetItem(strList[8]));this->setItem(K,9,new QTableWidgetItem(strList[9]));this->setItem(K,10,new QTableWidgetItem(strList[10]));K=K+1;}
}void TableWidget::wheelEvent(QWheelEvent *event)
{int delta= event->delta();if(delta>0){if(m_CurrentRow!=0){ClearAllRow();m_CurrentRow=m_CurrentRow-5;UpLoadData();float Value=float(m_CurrentRow)/float(m_strList.size());float currentValue=Value*this->verticalScrollBar()->maximum();this->verticalScrollBar()->setValue(currentValue);}}else{if(m_CurrentRow<m_strList.size()-500){m_CurrentRow=m_CurrentRow+5;ClearAllRow();DownLoadData();float Value=float(m_CurrentRow)/float(m_strList.size());float currentValue=Value*this->verticalScrollBar()->maximum();this->verticalScrollBar()->setValue(currentValue);}}
}void TableWidget::onValueChanged(float i_value)
{m_CurrentRow=i_value*(m_strList.size()-500);ClearAllRow();int K=0;this->setRowCount(500);for(int i=m_CurrentRow;i<m_CurrentRow+500;i++){QString str=m_strList[i];QStringList strList=str.split("&");this->setItem(K,0,new QTableWidgetItem(strList[0]));this->setItem(K,1,new QTableWidgetItem(strList[1]));this->setItem(K,2,new QTableWidgetItem(strList[2]));this->setItem(K,3,new QTableWidgetItem(strList[3]));this->setItem(K,4,new QTableWidgetItem(strList[4]));this->setItem(K,5,new QTableWidgetItem(strList[5]));this->setItem(K,6,new QTableWidgetItem(strList[6]));this->setItem(K,7,new QTableWidgetItem(strList[7]));this->setItem(K,8,new QTableWidgetItem(strList[8]));this->setItem(K,9,new QTableWidgetItem(strList[9]));this->setItem(K,10,new QTableWidgetItem(strList[10]));K=K+1;}
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include "tablewidget.h"class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:TableWidget *m_pTableWgt=nullptr;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include <QFile>
#include <qdebug.h>
#include <QVBoxLayout>Widget::Widget(QWidget *parent): QWidget(parent)
{this->resize(800,500);m_pTableWgt=new TableWidget(this);QVBoxLayout *mainLayout=new QVBoxLayout(this);mainLayout->addWidget(m_pTableWgt);mainLayout->setMargin(0);this->setLayout(mainLayout);}Widget::~Widget()
{}

我测试的数据是70万行左右的数据,会吃掉200mb左右的内存。这个应该是正常的。文件大小80mb。通过文本文件打开,大概180mb左右

在滑动的时候,内存是不会改变的。

我给出我tablewidget的格式,然后复制到记事本,复制粘贴就行。

1512058602&   2884.00&  12010.00  &1&G1& 644347.8& 4229422.2&3123.7&38 12 04.281 N&076 38 54.825 E&3123.70&    &    &&
1512058603&   2884.00&  12011.00  &1&G1& 644357.8& 4229439.4&3123.8&38 12 04.833 N&076 38 55.249 E&3123.80&    &    &&
1512058604&   2884.00&  12012.00  &1&G1& 644367.7& 4229456.9&3123.1&38 12 05.395 N&076 38 55.669 E&3123.10&    &    &&
1512058605&   2884.00&  12013.00  &1&G1& 644377.8& 4229474.1&3124.3&38 12 05.947 N&076 38 56.096 E&3124.30&    &    &&
1512058606&   2884.00&  12014.00  &1&G1& 644387.7& 4229491.4&3125.6&38 12 06.502 N&076 38 56.516 E&3125.60&    &    &&
1512058607&   2884.00&  12015.00  &1&G1& 644397.7& 4229508.8&3125.3&38 12 07.061 N&076 38 56.940 E&3125.30&    &    &&
1512058608&   2884.00&  12016.00  &1&G1& 644407.7& 4229526.0&3125.4&38 12 07.613 N&076 38 57.363 E&3125.40&    &    &&
1512058609&   2884.00&  12017.00  &1&G1& 644417.7& 4229543.4&3125.7&38 12 08.171 N&076 38 57.787 E&3125.70&    &    &&

ヾ( ̄▽ ̄)ByeBye

qtableiwdget优化之再优化(大批量数据加载不卡顿)相关推荐

  1. linux访问文档根目录之外的网页_开发文档加载不再卡顿,亿点点提升

    作为一个头(ku)秃(bi)的开发者,查阅各种文档是家常便饭,但由于中国特色在查阅一些文档时总是加载中.而且有时外场调试还不一定有网,因而将文档本地化是相当有必要的.本文介绍了一种将文档编译为静态网页 ...

  2. 如何解决web端图片加载慢卡顿的问题???

    公司官网上面有一的功能是在后台发布公司动态之后,在前台显示公司动态内容. 但是上上周团建之后,上传的公司动态中的图片加载速度就非常的慢. 图片加载慢的原因有两个: 1.图片过大导致的加载缓慢. 2.网 ...

  3. Android studio异步数据加载ListView+Adapter+AsyncTask

    最近系统学习了关于异步数据加载的相关知识,之前在项目中,这一块不是由我负责,现在回顾一下,项目中没有用到数据缓存,即每次用户的请求都要去网络获取,网络不好时,加载慢或者加载不出来,测试人员提出该问题时 ...

  4. Unity大场景数据加载及优化方案

    前段时间,有几个虚拟仿真公司跟我请教关于大地形的加载优化问题,它们使用的引擎都是自己研发的,引擎对于开发者来说,大同小异,它们的基本构造是一样的,关键是在于解决问题的方法,正是基于这个前提写了这个课程 ...

  5. Unity导表工具Luban插件的数据加载原理与优化

    文章目录 1. 配置Luban并测试 2. Luban 数据加载原理 3. 根据工程进行懒加载优化 3.1 增加公共接口与接口实现方法 3.2 外部提供获取数据的方法 3.3 对Luban中的导表模板 ...

  6. 【深度学习-数据加载优化-训练速度提升一倍】

    1,介绍 数据加载 深度学习的训练,简单的说就是将数据切分成batch,丢入模型中,并计算loss训练.其中比较重要的一环是数据打batch部分(数据加载部分). 训练时间优化: 深度学习训练往往需要 ...

  7. 深度学习【使用pytorch实现基础模型、优化算法介绍、数据集的加载】

    文章目录 一 Pytorch完成基础模型 1. Pytorch完成模型常用API 1.1 `nn.Module` 1.2 优化器类 1.3 损失函数 1.4 线性回归完整代码 2. 在GPU上运行代码 ...

  8. vue路由懒加载_优化vue项目的首屏加载速度

    最近使用vue-cli3构建了一个小型的博客系统,完工之后,build打包出来发现一个chunk-vendors包就有1.1m,部署上去之后,访问的时候,首屏加载非常慢.居然需要21s,体验极差. 这 ...

  9. nginx加载图片慢_优化vue项目的首屏加载速度

    最近使用vue-cli3构建了一个小型的博客系统,完工之后,build打包出来发现一个chunk-vendors包就有1.1m,部署上去之后,访问的时候,首屏加载非常慢.居然需要21s,体验极差. 这 ...

  10. 优化Flash中的3D模型加载

    2019独角兽企业重金招聘Python工程师标准>>> 来自:Kid's Zone 最近在做一个公司的Flash3D页游项目,遇到了这个问题,前前后后断断续续也优化了一段时间,觉得还 ...

最新文章

  1. XDC约束技巧——CDC篇
  2. pil拷贝,剪切,缩放
  3. 风雨20年:我所积累的20条编程经验 (转)
  4. Rancher Kubernetes Engine(RKE)正式发布:闪电般的Kubernetes安装部署体验
  5. python虚拟人脸生成_Python-OpenCV人脸识别之数据集生成
  6. 如何调整标题字体大小_如何将「双代号网络图」调整清晰美观
  7. 全卷积神经网络 图像语义分割实验:FCN数据集制作,网络模型定义,网络训练(提供数据集和模型文件,以供参考)
  8. Linux安装VIM执行sudo apt-get install vim 现在没有可用的软件包但是它被其他软件包用了
  9. 迅雷的FLV文件迷你播放器
  10. 视频信号数字光纤传输 光纤传输让高清视频传输更简单
  11. pt-online-schema-change 脚本化
  12. 跨考计算机要选择408吗,408难度比较大,对于跨考更是如此,应从以下三个方面做准备...
  13. 体系结构24_输入输出系统(1)
  14. 基于SpringBoot+Bootstrap【爱码个人博客系统】附源码
  15. excel绘制气泡图步骤
  16. mysql 安装版和解压版的区别_Mysql5.7解压版的安装和卸载及常见问题小结
  17. 首台微型计算机,全球首台骁龙820微型电脑:DragonBoard 820c
  18. SOHO如何做外贸独立站?
  19. Ardunio开发实例-ENC28J60以太网模块实现Web服务器
  20. spring boot 转pdf (html转pdf)

热门文章

  1. [Tarjan四连]Tarjan缩点
  2. js基础-5-数据类型,作用域,优先级
  3. 存储基本概念与SAN存储
  4. postmessage传递字符串_postMessage 还能这样玩
  5. perl python json_JSON Perl
  6. python软件源码下载_【图片】分享一段功能非常简陋的python代码实现下载free种【pt吧】_百度贴吧...
  7. java doctitle_Java ActionItem.setDocTitle方法代码示例
  8. 钓鱼网站 (搬运自common craft )
  9. android 常用输入法,[转载]Android 系统输入法的调用
  10. 虚拟机python pip安装不了_给在Linux虚拟机里运行的FreeBSD 12安装pip Python包管理器...