本文介绍用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万条数据,但是程序占用的内存很高,需要优化,下一篇文章介绍优化方法。
本文技术来源一个小项目,完整项目地址。