QTableView大数据文件显示(1000万行数据)

参考:

(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文库

  • 3
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值