Qt 进阶 04|自定义 Model 实战,继承 QAbstractTableModel 实现表格数据
·
一、使用场景
当数据量大、数据结构复杂、需要和业务数据深度绑定,QStandardItemModel 灵活性不足,必须继承QAbstractTableModel 实现自定义表格模型。
二、核心重写纯虚函数
继承该抽象类,必须实现 4 个核心接口:
rowCount():返回数据总行数columnCount():返回数据总列数data():视图请求单元格数据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 和数据角色是关键。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)