lxg

导航

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

posted on 2020-11-27 10:35  lxg_7105  阅读(1071)  评论(0编辑  收藏  举报