目录
四、Delegate + Model + View 自定义模型实现
1、QtTabelWidget.cpp - 组织界面,定义数据模型、委托、代理
2、QtModelViewTabelDelegate.cpp - 委托:用于 绘制自定义 名片控件
3、StudentTableModel.cpp - 创建模型类,提供数据的调用接口
4、TabelSortFilterProxyModel.cpp - 代理:用于对数据过滤、排序
零、附上最新版本
1、附上成果图:( 四 代码对应的效果图)
1、使用 QTableView 显示 10万条数据
2、每一条用自定义界面(名片的形式) 来显示
3、提供搜索过滤功能
2、代码位置:
https://download.csdn.net/download/LearnLHC/15933659
一、常用实现方式 - 有多少就创建多少,就显示多少
1、MainWindow.h文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QWidget>
#include <QTableWidget>
#include <QVBoxLayout>
#include <QTableWidgetItem>
#include <QList>
#include <QString>
struct Student
{
char name[16];
char id[24];
char sex[8];
int age;
char phone[16];
char hobby[24];
char company[16];
};
class MainWindow : public QWidget
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
/**
* @brief 生成数据
* @param size,生成数据的规模
*/
void generateData(int size);
private:
/**
* @brief 生成一行数据
* @param item,数据项
* @return 返回数据项链表
*/
QList<QTableWidgetItem*> generateRow(const Student& item);
private:
QTableWidget* m_table;
};
#endif // MAINWINDOW_H
2、MainWindow.cpp文件:
#include "MainWindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) : QWidget(parent)
{
m_table = new QTableWidget(this);
QVBoxLayout* layout = new QVBoxLayout;
layout->addWidget(m_table);
setLayout(layout);
QStringList header;
header << "Name" << "ID" << "Sex" << "Age" << "Phone" << "Hobby" << "Company";
m_table->setHorizontalHeaderLabels(header);
m_table->setColumnCount(7);
}
MainWindow::~MainWindow()
{
}
// 头部插入实现
void MainWindow::generateData(int size)
{
Student* zhangsan = (Student*)malloc(sizeof(Student));
memset(zhangsan, 0, sizeof(Student));
strncpy(zhangsan->name, "zhangsan", strlen("zhangsan"));
strncpy(zhangsan->id, "53302219861001xxxx", strlen("53302219861001xxxx"));
strncpy(zhangsan->sex, "M", strlen("M"));
zhangsan->age = 33;
strncpy(zhangsan->phone, "18910108888", strlen("18910108888"));
strncpy(zhangsan->hobby, "BasketBall, Play", strlen("BasketBall, Play"));
strncpy(zhangsan->company, "Alibaba", strlen("Alibaba"));
for(int i = 0; i < size; i++)
{
m_table->insertRow(0);
QList<QTableWidgetItem*> items1 = generateRow(*zhangsan);
for(int k = 0; k < items1.size(); k++)
{
m_table->setItem(0, k, items1.at(k));
}
}
delete zhangsan;
qDebug() << sizeof(Student);
}
// 尾部插入实现
void MainWindow::generateData(int size)
{
Student* zhangsan = (Student*)malloc(sizeof(Student));
memset(zhangsan, 0, sizeof(Student));
strncpy(zhangsan->name, "zhangsan", strlen("zhangsan"));
strncpy(zhangsan->id, "53302219861001xxxx", strlen("53302219861001xxxx"));
strncpy(zhangsan->sex, "M", strlen("M"));
zhangsan->age = 33;
strncpy(zhangsan->phone, "18910108888", strlen("18910108888"));
strncpy(zhangsan->hobby, "BasketBall, Play", strlen("BasketBall, Play"));
strncpy(zhangsan->company, "Alibaba", strlen("Alibaba"));
for(int i = 0; i < size; i++)
{
m_table->insertRow(i);
QList<QTableWidgetItem*> items1 = generateRow(*zhangsan);
for(int k = 0; k < items1.size(); k++)
{
m_table->setItem(i, k, items1.at(k));
}
}
delete zhangsan;
qDebug() << sizeof(Student);
}
QList<QTableWidgetItem*> MainWindow::generateRow(const Student &item)
{
QList<QTableWidgetItem*> ret;
QTableWidgetItem* name = new QTableWidgetItem();
name->setData(Qt::DisplayRole, QString("%1").arg(item.name));
ret.append(name);
QTableWidgetItem* id = new QTableWidgetItem();
id->setData(Qt::DisplayRole, QString("%1").arg(item.id));
ret.append(id);
QTableWidgetItem* sex = new QTableWidgetItem();
sex->setData(Qt::DisplayRole, QString("%1").arg(item.sex));
ret.append(sex);
QTableWidgetItem* age = new QTableWidgetItem();
age->setData(Qt::DisplayRole, QString("%1").arg(item.age));
ret.append(age);
QTableWidgetItem* phone = new QTableWidgetItem();
phone->setData(Qt::DisplayRole, QString("%1").arg(item.phone));
ret.append(phone);
QTableWidgetItem* hobby = new QTableWidgetItem();
hobby->setData(Qt::DisplayRole, QString("%1").arg(item.hobby));
ret.append(hobby);
QTableWidgetItem* company = new QTableWidgetItem();
company->setData(Qt::DisplayRole, QString("%1").arg(item.company));
ret.append(company);
return ret;
}
3、main.cpp文件:
#include "MainWindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.generateData(500000);
w.show();
return a.exec();
}
4、性能分析
Student结构体如下:
struct Student
{
char name[16];
char id[24];
char sex[8];
int age;
char phone[16];
char hobby[24];
char company[16];
};
Student结构体大小为108字节,根据生成的不同数量规模的数据,其程序占用的内存如下:
根据上述数据,在大规模数据量下,使用QTableWidget展示数据时,每条数据实际占用的内存是数据本身大小的15倍,数据量越大插入越耗时,头部插入耗时远远大于尾部追加插入。
二、Model / View 标准模型实现
1、StudentTableModel.h文件
#ifndef STUDENTTABLEMODEL_H
#define STUDENTTABLEMODEL_H
#include <QStandardItemModel>
#include <QStandardItem>
struct Student
{
char name[16];
char id[24];
char sex[8];
int age;
char phone[16];
char hobby[24];
char company[16];
};
class StudentTableModel : public QStandardItemModel
{
Q_OBJECT
public:
StudentTableModel();
/**
* @brief 生成数据
* @param size,数据规模
*/
void generateData(int size);
/**
* @brief 生成一行数据
* @