QTableView加载百万条数据占用内存少


原链接:
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();
}

					


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM