参考:

(2条消息) QTableWidget大数据文件显示(1000万行数据)_江南又旧雨的博客-CSDN博客

1,QTableView直接加载显示1000万行数据进行显示。

读取文件时间+表格插入数据时间   需要等待的比较久。

表格后期插入一行数据大概需要0.1ms,1000万行数据,大概得100s得时间。

//加载大数据

m_pTestView = new QTableView(this);

QStandardItemModel *model = new QStandardItemModel();

m_pTestView->setModel(model);

model->setColumnCount(15);

for (int i = 0; i < 10; i++)

{

model->setHeaderData(i, Qt::Horizontal, QString::fromLocal8Bit(DefQSReceiverInfoTableSize[i][0]));

}

QVBoxLayout *mainLayout = new QVBoxLayout(ui.widget);

mainLayout->addWidget(m_pTestView);

mainLayout->setMargin(0);

mainLayout->setSpacing(0);

QString filePath = "./ReceiverTableData10000000.txt";

ui.widget->setLayout(mainLayout);

加载数据

FILE *ifp = fopen(filePath.toStdString().data(), "r");

if (ifp == NULL)

{

printf("Cannot open point cloud file.\n");

return ;

}

const int BUFSIZE = 512;

char buf[BUFSIZE];

memset(buf, '\0', BUFSIZE);

quint32 i = 0;

while (fgets(buf, BUFSIZE, ifp) != NULL)

{

QString line = QByteArray(buf, strlen(buf)-1);

memset(buf, '\0', BUFSIZE);

QStringList strList = line.split("&");

model->insertRow(i);

model->setData(model->index(i, 0),strList[0]);

model->setData(model->index(i, 1), strList[1]);

model->setData(model->index(i, 2), strList[2]);

model->setData(model->index(i, 3), strList[3]);

model->setData(model->index(i, 4), strList[4]);

model->setData(model->index(i, 5), strList[5]);

model->setData(model->index(i, 6), strList[6]);

model->setData(model->index(i, 7), strList[7]);

model->setData(model->index(i, 8), strList[8]);

model->setData(model->index(i, 9), strList[9]);

model->setData(model->index(i, 10), strList[10]);

//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;

}

fclose(ifp);

ifp = 0;

2,动态文件加载,开启一个线程读文件,这样就不会因为读取文件时间长导致界面卡死;在QTableView采用分页显示,每次交互只加载需要在屏幕上显示的那些行数据,表格固定的是一百行,每次操作对这一百行数据进行刷新,虚拟出完整表格的效果。

参考下文博客中得动态加载:

(2条消息) QTableWidget大数据文件显示(1000万行数据)_江南又旧雨的博客-CSDN博客

3.自定义TableMode,继承QStandardItemModel

效果同1,可参考性能分析:

(2条消息) QT 如何用表格显示大数量的数据_江南又旧雨的博客-CSDN博客

4.自定义TableMode模型,继承QAbstractTableModel,自定义数据模型。

可以很快得加载完1000万行大数据,并且占用的内存也不大。

class MyTableModel : public QAbstractTableModel

struct Student

{

char name[16];

char id[24];

char sex[8];

int age;

char phone[16];

char hobby[24];

char company[16];

};

//使用QVector作为模型的底层数据结构存储数据,其内存占用与QList相当,尾部追加插入耗时与QList相当,但头部插入比QList耗时较多

QList m_itemList;

struct ModelItem {

QString id;

QString name;

QString one;

QString two;

QString three;

QString four;

QString five;

QString six;

};

QList modelData;

测试:开始的卡顿,主要是数据解析耗时,后面可以使用多线程加载数据,不卡顿界面。向表格中加载大数据还是非常快的。

 源代码:

(2条消息) 自定义TableMode模型,继承QAbstractTableModel,自定义数据模型,可加载1千万行大数据资源-CSDN文库

文章链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: