Qt 进阶 04|自定义 Model 实战,继承 QAbstractTableModel 实现表格数据
一、使用场景当数据量大、数据结构复杂、需要和业务数据深度绑定QStandardItemModel灵活性不足必须继承QAbstractTableModel实现自定义表格模型。二、核心重写纯虚函数继承该抽象类必须实现 4 个核心接口rowCount()返回数据总行数columnCount()返回数据总列数data()视图请求单元格数据headerData()表头文本三、完整代码实现1. 头文件 customtablemodel.hcpp运行#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: QVectorQStringList m_data; // 内部存储二维数据 }; #endif // CUSTOMTABLEMODEL_H2. 源文件 customtablemodel.cppcpp运行#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和数据角色是关键。