我们在使用qtableview的时候,加载100行的数据,你不会感到有任何卡顿,但是加载百万行的数据,你会感到界面已经卡死,我们来看下效果:

这是我需要加载的一个文件,我们看,共有100万行左右的数据,我们来看下没有优化的写法,及运行时候的效果:
代码:

m_pTestView = new EP_TableView(this);
QStandardItemModel *model = new QStandardItemModel();
m_pTestView->setModel(model);QVBoxLayout *mainLayout=new QVBoxLayout(this);
mainLayout->addWidget(m_pTestView);
mainLayout->setMargin(0);
mainLayout->setSpacing(0);
this->setLayout(mainLayout);
//加载数据
QFile file("C:/Users/dujia/Desktop/ReceiverTableData.txt");if (!file.open(QIODevice::ReadOnly | QIODevice::Text))return;int i=0;while (!file.atEnd()) {QString strLine=file.readLine();QStringList strList=strLine.split("&");model->setItem(i,0,new QStandardItem(strList[0]));model->setItem(i,1,new QStandardItem(strList[1]));model->setItem(i,2,new QStandardItem(strList[2]));model->setItem(i,3,new QStandardItem(strList[3]));model->setItem(i,4,new QStandardItem(strList[4]));model->setItem(i,5,new QStandardItem(strList[5]));model->setItem(i,6,new QStandardItem(strList[6]));model->setItem(i,7,new QStandardItem(strList[7]));model->setItem(i,8,new QStandardItem(strList[8]));model->setItem(i,9,new QStandardItem(strList[9]));model->setItem(i,10,new QStandardItem(strList[10]));i=i+1;}

效果:

当我运行的时候,界面是直接卡死的,可以看到cpu的占用了也很高。

下面开始进行优化,使用多线程,在程序运行时,单独开出一条线程,用来对model数据的加载,
这样会解决卡顿问题,界面也不会迟迟不显示。

直接看代码:
自定义model类
.h

#ifndef STANDARDITEMMODEL_H
#define STANDARDITEMMODEL_H#include <QObject>
#include <QStandardItemModel>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 StandardItemModel : public QStandardItemModel
{Q_OBJECT
public:explicit StandardItemModel(QObject *parent = nullptr);~StandardItemModel();
signals:public slots:void CreateData(QString i_path);
};#endif // STANDARDITEMMODEL_H

.cpp

#include "standarditemmodel.h"
#include <QFile>
#include <QElapsedTimer>
#include <qdebug.h>StandardItemModel::StandardItemModel(QObject *parent) : QStandardItemModel(parent)
{this->setColumnCount(15);for(int i=0;i<15;i++){this->setHeaderData(i, Qt::Horizontal, QString::fromLocal8Bit(DefQSReceiverInfoTableSize[i][0]));}
}StandardItemModel::~StandardItemModel()
{}
//这里用于动态加载数据
void StandardItemModel::CreateData(QString i_path)
{QFile file(i_path);if (!file.open(QIODevice::ReadOnly | QIODevice::Text))return;int i=0;while (!file.atEnd()) {QString strLine=file.readLine();QStringList strList=strLine.split("&");this->setItem(i,0,new QStandardItem(strList[0]));this->setItem(i,1,new QStandardItem(strList[1]));this->setItem(i,2,new QStandardItem(strList[2]));this->setItem(i,3,new QStandardItem(strList[3]));this->setItem(i,4,new QStandardItem(strList[4]));this->setItem(i,5,new QStandardItem(strList[5]));this->setItem(i,6,new QStandardItem(strList[6]));this->setItem(i,7,new QStandardItem(strList[7]));this->setItem(i,8,new QStandardItem(strList[8]));this->setItem(i,9,new QStandardItem(strList[9]));this->setItem(i,10,new QStandardItem(strList[10]));i=i+1;}qDebug()<<"i::"<<i;qDebug()<<"this:::"<<this->rowCount();
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include "ep_tableview.h"
#include <QTableWidget>
#include <QThread>class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void Start();signals:void startRunning(QString);private:EP_TableView *m_pTestView=nullptr;QThread m_thread;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ep_tableview.h"
#include <QStandardItemModel>
#include <QFile>
#include <QVBoxLayout>
#include <QElapsedTimer>
#include <QDebug>
#include <QScrollBar>
#include <QHeaderView>
#include "standarditemmodel.h"
Widget::Widget(QWidget *parent): QWidget(parent)
{this->resize(800,500);QFont textFont;textFont.setPointSize(12);textFont.setFamily("Microsoft YaHei");m_pTestView = new EP_TableView(this);//------------------------threadStandardItemModel *model = new StandardItemModel();model->moveToThread(&m_thread);connect(this,&Widget::startRunning,model,&StandardItemModel::CreateData);connect(&m_thread,&QThread::finished,model,&QObject::deleteLater);m_thread.start();//-----------------------m_pTestView->setFont(textFont);m_pTestView->setModel(model);QVBoxLayout *mainLayout=new QVBoxLayout(this);mainLayout->addWidget(m_pTestView);mainLayout->setMargin(0);mainLayout->setSpacing(0);this->setLayout(mainLayout);//    QFile file("C:/Users/dujia/Desktop/ReceiverTableData.txt");
//    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
//        return;//    int i=0;
//    while (!file.atEnd()) {//        QString strLine=file.readLine();
//        QStringList strList=strLine.split("&");
//        model->setItem(i,0,new QStandardItem(strList[0]));
//        model->setItem(i,1,new QStandardItem(strList[1]));
//        model->setItem(i,2,new QStandardItem(strList[2]));
//        model->setItem(i,3,new QStandardItem(strList[3]));
//        model->setItem(i,4,new QStandardItem(strList[4]));
//        model->setItem(i,5,new QStandardItem(strList[5]));
//        model->setItem(i,6,new QStandardItem(strList[6]));
//        model->setItem(i,7,new QStandardItem(strList[7]));
//        model->setItem(i,8,new QStandardItem(strList[8]));
//        model->setItem(i,9,new QStandardItem(strList[9]));
//        model->setItem(i,10,new QStandardItem(strList[10]));
//        i=i+1;
//    }
}Widget::~Widget()
{m_thread.quit();m_thread.wait();
}void Widget::Start()
{emit startRunning("C:/Users/dujia/Desktop/ReceiverTableData.txt");
}

//数据文件的话自己随便一个就可以

看下优化后的运行:

我们看到数据显示出来,并且在实时的的加载。

qt之解决qtableview加载百万行数据卡顿问题相关推荐

  1. Qt笔记-解决Q3DScatter加载QCustom3DItem时Cannot open the file问题

    Qt在撸3D程序的时候,这里使用c++去撸,不使用qml. 这里使用QCustom3DItem,然后使用Q3DScatter去加载的时候. 会出现这样的问题, qDebug() << &q ...

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

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

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

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

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

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

  7. 解决GitHub加载和下载慢问题

    解决GitHub加载和下载慢问题 参考文章: (1)解决GitHub加载和下载慢问题 (2)https://www.cnblogs.com/wghao/p/10858558.html (3)https ...

  8. 解决pjax加载页面不执行js插件的问题

    解决pjax加载页面不执行js插件的问题 参考文章: (1)解决pjax加载页面不执行js插件的问题 (2)https://www.cnblogs.com/fanwenhao/p/9643549.ht ...

  9. 解决GitHub加载不出图片问题

    解决GitHub加载不出图片问题 参考文章: (1)解决GitHub加载不出图片问题 (2)https://www.cnblogs.com/jooy/p/12090882.html 备忘一下.

  10. 使用jquery的load方法设计动态加载,并解决被加载页面JavaScript失效问题

    使用jquery的load方法设计动态加载,并解决被加载页面JavaScript失效问题 参考文章: (1)使用jquery的load方法设计动态加载,并解决被加载页面JavaScript失效问题 ( ...

最新文章

  1. C++实现判断两个单词是否为变位词
  2. 【Flutter】Icons 组件 ( FlutterIcon 下载图标 | 自定义 svg 图标生成 ttf 字体文件 | 使用下载的 ttf 图标文件 )
  3. css 缩放_CSS 中 transform、animation、transition、translate的区别
  4. java中content啥意思_JSTL标签中的body-content标签体内容输出格式的介绍
  5. 玩转oracle 11g(15):命令学习3
  6. Going to 的将来时态_47
  7. C语言复习4_while循环
  8. 在线图片转base64工具
  9. 1.2.3休眠(Sleeping)
  10. 用html设计前台界面,UI设计系列:WEB前端界面设计
  11. mysql dump hbase_mysqldump 导出数据库 结构
  12. H7-TOOL的WiFi版基本成形,无线烧录,无线RTT,无线串口,无线CAN/CANFD,无线LUA小程序,无线示波器等,且支持局域网和外网
  13. bt磁力种子与php文件,视频 | BT 种子和磁力链接是如何工作的?
  14. win32 mysql误删数据恢复_mysql误删数据恢复
  15. 100项目插件激活程序验证码,自行复制
  16. pyhton 将ASCII码转换为字符char(),将字符转换为ASCII码ord()
  17. UDS之浅谈14 服务
  18. 学姐把我拉进小树林,奇怪的知识增加了
  19. STM32中的RCC是什么意思
  20. PKU ACM 1006 生理周期

热门文章

  1. python的ogr模块_Python与开源GIS:使用OGR模块打开矢量数据
  2. python time函数的功能_Python中Python时间模块的常用功能,Pythontime,函数
  3. gopython 获取python 全局线程锁失败_Python之路(第四十三篇)线程的生命周期、全局解释器锁...
  4. zynq processing system 参数设置_【正点原子FPGA连载】第六章自定义IP核-呼吸灯实验-领航者 ZYNQ 之嵌入式开发指南...
  5. 计算机关闭提示音,即将发布:如何关闭Apple计算机启动提示音
  6. linux安装pl脚本,nagios插件脚本check_linux_stats.pl 安装
  7. 博图编写温度程序_数字式温度控制器程序设计
  8. SpringBoot系列(3):SpringBoot2.1.x源码阅读环境搭建详解
  9. C语言:使用递归解决汉诺塔问题。
  10. 数据分析的一些简单思路总结