一、使用场景

当数据量大、数据结构复杂、需要和业务数据深度绑定,QStandardItemModel 灵活性不足,必须继承QAbstractTableModel 实现自定义表格模型。


二、核心重写纯虚函数

继承该抽象类,必须实现 4 个核心接口

  1. rowCount():返回数据总行数
  2. columnCount():返回数据总列数
  3. data():视图请求单元格数据
  4. headerData():表头文本

三、完整代码实现

1. 头文件 customtablemodel.h

cpp

运行

#ifndef CUSTOMTABLEMODEL_H
#define CUSTOMTABLEMODEL_H

#include <QAbstractTableModel>
#include <QVector>
#include <QStringList>

class CustomTableModel : public QAbstractTableModel
{
    Q_OBJECT
public:
    explicit CustomTableModel(QObject *parent = nullptr);

    // 核心接口
    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;
    QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;

private:
    QVector<QStringList> m_data;  // 内部存储二维数据
};

#endif // CUSTOMTABLEMODEL_H
2. 源文件 customtablemodel.cpp

cpp

运行

#include "customtablemodel.h"

CustomTableModel::CustomTableModel(QObject *parent)
    : QAbstractTableModel(parent)
{
    // 初始化测试数据
    m_data << QStringList{"李四","24","男"}
           << QStringList{"王五","26","女"}
           << QStringList{"赵六","23","男"};
}

int CustomTableModel::rowCount(const QModelIndex &parent) const
{
    if(parent.isValid()) return 0;
    return m_data.size();
}

int CustomTableModel::columnCount(const QModelIndex &parent) const
{
    if(parent.isValid()) return 0;
    return m_data.isEmpty() ? 0 : m_data[0].size();
}

QVariant CustomTableModel::data(const QModelIndex &index, int role) const
{
    if(!index.isValid()) return QVariant();
    int row = index.row();
    int col = index.column();

    if(role == Qt::DisplayRole)
    {
        return m_data[row][col];
    }
    return QVariant();
}

QVariant CustomTableModel::headerData(int section, Qt::Orientation orientation, int role) const
{
    if(role != Qt::DisplayRole) return QVariant();
    if(orientation == Qt::Horizontal)
    {
        QStringList headers = {"姓名","年龄","性别"};
        return headers[section];
    }
    return QVariant();
}
3. 主窗口调用

cpp

运行

CustomTableModel *model = new CustomTableModel(this);
ui->tableView->setModel(model);

四、扩展说明

  • Qt::DisplayRole:正常展示文本角色,最常用;
  • 如需单元格图标、颜色、编辑功能,继续重写 setData()flags()
  • 数据增删改后,调用 beginResetModel() / endResetModel() 刷新视图。

小结

自定义 Table Model 是 Qt 表格大数据开发的核心,理解索引 QModelIndex 和数据角色是关键。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐