参考:
(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<Student*> m_itemList;
struct ModelItem {
QString id;
QString name;
QString one;
QString two;
QString three;
QString four;
QString five;
QString six;
};
QList<ModelItem> modelData;
测试:开始的卡顿,主要是数据解析耗时,后面可以使用多线程加载数据,不卡顿界面。向表格中加载大数据还是非常快的。
源代码:
(2条消息) 自定义TableMode模型,继承QAbstractTableModel,自定义数据模型,可加载1千万行大数据资源-CSDN文库
版权归原作者 江南又旧雨 所有, 如有侵权,请联系我们删除。