原文地址::https://blog.csdn.net/yyt593891927/article/details/107733138
相关文章
1、优化QTableView加载百万条数据占用内存----https://blog.csdn.net/yyt593891927/article/details/107733899
2、qt之解决qtableview加载百万行数据卡顿问题----https://blog.csdn.net/weixin_43676892/article/details/114737678
3、QTableView加载百万条数据占用内存少----https://www.cnblogs.com/kinglxg/p/14046628.html
4、QTreeView处理大量数据(使用1000万条数据,每次都只是部分刷新)----https://www.cnblogs.com/findumars/p/5615696.html
本文介绍用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;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
构造函数
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
setTableHead(); //显示表头
}
1
2
3
4
5
6
7
8
显示表头函数
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);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
显示表格数据函数
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);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
生成表格数据函数
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);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
4.运行结果
看到程序运行的结果,表格第一列序号到了1000000,显示了100万条数据,但是消耗了2249MB的内存,内存占用的很高。
4.小结
虽然用QTableView实现表格显示100万条数据,但是程序占用的内存很高,需要优化,下一篇文章介绍优化方法。
本文技术来源一个小项目,完整项目地址。
————————————————
版权声明:本文为CSDN博主「丁爸」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yyt593891927/article/details/107733138