0


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

标签: qt ui 开发语言

本文转载自: https://blog.csdn.net/weixin_38293453/article/details/129817649
版权归原作者 江南又旧雨 所有, 如有侵权,请联系我们删除。

“QTableView大数据文件显示(1000万行数据)”的评论:

还没有评论