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