QTableView实现表格加载百万条数据

本文介绍用QTableView实现加载100万条数据显示到表格。

1.创建工程

用Qt Creator创建Qt Widgets Application项目,基类选择QWidget,创建好了,如图:
在这里插入图片描述

2.添加QTableView控件

在widget.ui中添加QTableView控件,和QPushButton,采用栅格布局,如图:
在这里插入图片描述

3.添加函数

头文件

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    void setTableHead(); //设置表头函数
    void updateTableData(const QVector< QVector<QString> > &result); //显示表格数据

private slots:
    void on_pushButton_clicked(); //生成表格数据槽函数

private:
    Ui::Widget *ui;
};

构造函数

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    setTableHead(); //显示表头
}

显示表头函数

void Widget::setTableHead()
{

    if (ui->tableView->model() == nullptr)
    {
        QStandardItemModel* model = new QStandardItemModel(ui->tableView);
        ui->tableView->setModel(model);
    }

    QStandardItemModel* model = ((QStandardItemModel*)ui->tableView->model());
    QStringList head;
    head << "序号"  << "账号" << "员工姓名" << "手机号码" << "邮箱" << "部门" << "岗位" << "账号状态" << "操作" << "操作";
    model->setHorizontalHeaderLabels(head);
    ui->tableView->setStyleSheet("QHeaderView::section { background:green; color:white;min-height:3em;}");
    ui->tableView->setGridStyle(Qt::SolidLine);
    ui->tableView->horizontalHeader()->setStretchLastSection(true);
    ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    ui->tableView->verticalHeader()->setVisible(false);
    ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
}

显示表格数据函数

void Widget::updateTableData(const QVector<QVector<QString> > &result)
{
    QStandardItemModel* model = ((QStandardItemModel*)ui->tableView->model());
    if (result.size() == 0) return;
    int start = model->rowCount();
    int col = result[0].size();
    int row = result.size();
    QIcon iconEdit(":/new/prefix1/images/edit.png");
    QIcon iconDel(":/new/prefix1/images/edit_remove.png");

    for (int i = 0; i<row; ++i)
    {
        QList<QStandardItem*> list;
        for (int j = 0; j<col; ++j)
        {
            if (j == col - 3)
            {
                list << new QStandardItem(result[i][j] == "1" ? "有效" : "无效");
            }
            else if (j == col - 2)
            {
                list << new QStandardItem(iconEdit, "编辑");
            }
            else if (j == col - 1)
            {
                list << new QStandardItem(iconDel, "删除");
            }
            else
            {
                list << new QStandardItem(result[i][j]);
            }
        }
        model->insertRow(i + start, list);
    }
}

生成表格数据函数

void Widget::on_pushButton_clicked()
{
    QVector< QVector<QString> > result;
    for (int i = 0; i < 1000000; ++i)
    {
        QVector<QString> tmp(10);
        tmp[0] = QString::number(i+1);
        tmp[1] = QString("test%1").arg(i+1);
        tmp[2] = tmp[1];
        tmp[7] = "1";
        tmp[8] = "";
        tmp[9] = "";
        result.push_back(tmp);
    }
    updateTableData(result);
}

4.运行结果

在这里插入图片描述
看到程序运行的结果,表格第一列序号到了1000000,显示了100万条数据,但是消耗了2249MB的内存,内存占用的很高。

4.小结

虽然用QTableView实现表格显示100万条数据,但是程序占用的内存很高,需要优化,下一篇文章介绍优化方法
本文技术来源一个小项目,完整项目地址

  • 7
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丁爸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值