Qt 基于QAbstractTableModel自定义TableModel

前言

平时用Qt的QTableWidget,后面感觉数据多的时候就改用QTableView了,model用的Qt自带的QStandardItemModel,但是数据过多还是会卡顿,而且QStandardItemModel功能很多,里面很多自己用不到的信号和槽,所以后面基于QAbstractTableModel自定义了自己的模型TableModel。

实现效果

插入一百万条数据,大概需要5s左右吧,然后设置单双行背景不一样,点击表格项显示提示信息。注意这里添加数据的时候不是一条一条数据添加的,因为循环调用==beginResetModel()endResetModel()==函数就会很卡。所以我是自定义了一个函数,可以一次新建多行数据。
效果图

需要实现的函数

想要自己的自定义Model能用起来,就必须实现基类QAbstractTableModel里的一些接口。如下:

// 返回行数
    int rowCount(const QModelIndex &parent = QModelIndex()) const override;
    // 返回列数
    int columnCount(const QModelIndex &parent = QModelIndex()) const override;
    // 根据模型索引返回当前的数据
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
    // 设置表格是否可编辑
    Qt::ItemFlags flags(const QModelIndex &index) const override;
    // 设置value数据给index处的role角色
    bool setData(const QModelIndex& index, const QVariant &value, int role=Qt::EditRole) override;
    // 返回表头
    QVariant headerData(int section, Qt::Orientation orientation, int role) const override;

rowCount接口返回的是行数,我是将数据存到QList里,然后返回这个QList的size();
columnCount接口返回的是列数,我是将水平表头保存到QStringList里,然后返回这个QStringList的size();
data接口比较重要,表格会一直调用该函数来获取当前数据以及一些其他信息;
flags接口影响表格是否可编辑,如果自定义表格需要双击表格可编辑数据的话,需要实现该接口和setData接口,后者用来处理编辑表格后数据怎么保存;
headerData返回水平方向或者垂直方向的表头。
以上所有接口都定义好之后自己的自定义TableModel基本就可以用了,后面的大部分自定义函数基本都是针对数据进行处理。

int MyTableModel::rowCount(const QModelIndex &parent) const
{
   
    if (parent.isValid()) {
   
        return 0;
    } else {
   
        return m_datas.size();
    }
}

int MyTableModel::columnCount(const QModelIndex &parent) const
{
   
    if (parent.isValid()) {
   
        return 0;
    } else {
   
        return m_HorizontalHead.size();
    }
}

QVariant MyTableModel::data(const QModelIndex &index, int role) const
{
   
    if (!index.isValid()) {
   
        return QVariant();
    }

    if (role == Qt::DisplayRole ||  role == Qt::EditRole) {
   
        return m_datas[index.row()][index.column()];//数据的呈现形式
    }else if(role == Qt::BackgroundColorRole){
   
        if(index.row() % 2 == 0)
            return QColor(192,192,192);//单元格背景色
        else
            return QColor(159,252,252);//单元格背景色
    }
    else if (role == Qt::TextAlignmentRole) {
       //对其方式
        return Qt::AlignCenter;
    }
    else if(role == Qt::ToolTipRole){
   
        return m_datas[index.row()][index.column()];//数据的提示信息
    }

    return QVariant();
}

Qt::ItemFlags MyTableModel::flags(const QModelIndex &index) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值