Qt 进阶 04|自定义 Model 实战,继承 QAbstractTableModel 实现表格数据
2026/6/15 2:22:31 网站建设 项目流程

一、使用场景

当数据量大、数据结构复杂、需要和业务数据深度绑定,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和数据角色是关键。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询