原鏈接:
https://blog.csdn.net/yyt593891927/article/details/107733138?utm_medium=distribute.pc_relevant_bbs_down.none-task-blog-baidujs-1.nonecase&depth_1-utm_source=distribute.pc_relevant_bbs_down.none-task-blog-baidujs-1.nonecase\
#ifndef CUSTOMTABLEMODEL_H
#define CUSTOMTABLEMODEL_H
#include <QAbstractTableModel>
/**
* @projectName psProject
* @brief 重寫QAbstractTableModel,QTableView加載一百萬條數據,加載時間不到1秒,占用內存很少
* @author lvxg
* @date 2020-11-27
*/
class CustomTableModel : public QAbstractTableModel
{
Q_OBJECT
public:
CustomTableModel(const QStringList &headList, QObject *parent = nullptr);
~CustomTableModel();
int rowCount(const QModelIndex& = QModelIndex()) const override;
int columnCount(const QModelIndex& = QModelIndex()) const override;
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
QVariant data(const QModelIndex &index, int role) const override;
//獲取行數據
QVector<QString> getRowData(int nRow);
//清空數據
void clear();
public slots:
//處理數據
void handleData(const QVector<QVector<QString> > &vecData);
signals:
void signalRecvhandleData();
private:
//行數
int m_nRow;
//列數
int m_nColumn;
//表頭
QStringList m_strListRoleList;
//加載數據
QVector<QVector<QString>> m_vecData;
};
#endif // CUSTOMTABLEMODEL_H
/////實現
#include "CustomTableModel.h"
#include <QColor>
CustomTableModel::CustomTableModel(const QStringList &headList, QObject *parent) : QAbstractTableModel(parent)
{
m_strListRoleList = headList;
}
CustomTableModel::~CustomTableModel()
{
}
int CustomTableModel::rowCount(const QModelIndex &) const
{
return m_nRow;
}
int CustomTableModel::columnCount(const QModelIndex &) const
{
return m_nColumn;
}
QVariant CustomTableModel::headerData(int section, Qt::Orientation orientation, int role) const
{
if (role == Qt::DisplayRole && orientation == Qt::Horizontal)
{
if (section < m_strListRoleList.size())
{
return m_strListRoleList[section];
}
}
return QAbstractItemModel::headerData(section, orientation, role);
}
QVariant CustomTableModel::data(const QModelIndex &index, int role) const
{
if(!index.isValid())
{
return QVariant();
}
switch (role)
{
case Qt::TextColorRole:
return QColor(Qt::black);
case Qt::TextAlignmentRole:
return QVariant(Qt::AlignLeft | Qt::AlignVCenter);
case Qt::DisplayRole:
{
if (m_vecData.size() > index.row())
{
if (m_vecData[0].size() > index.column())
{
return m_vecData[index.row()][index.column()];
}
}
return QVariant();
}
case Qt::CheckStateRole:
{
return QVariant(); // 返回勾選框,如果返回QVariant()就沒有勾選框
}
default:
return QVariant();
}
}
QVector<QString> CustomTableModel::getRowData(int nRow)
{
if (nRow < 0 || nRow >= m_vecData.size())
{
QVector<QString> vecResult(0);
return vecResult;
}
return m_vecData[nRow];
}
void CustomTableModel::clear()
{
m_vecData.clear();
m_nRow = 0;
m_nColumn = 0;
}
void CustomTableModel::handleData(const QVector<QVector<QString> > &vecData)
{
//emit signalRecvhandleData();
// 開始刷新模型
beginResetModel();
m_vecData = vecData;
m_nRow = m_vecData.size();
m_nColumn = m_nRow > 0 ? m_vecData[0].size() : 0;
// 結束刷新模型
endResetModel();
}