1. QTableView与数据模型基础概念
在Qt框架中,QTableView是Model/View架构的核心组件之一,它负责以表格形式展示数据。与传统的MVC模式不同,Qt采用了更灵活的Model/View设计,将数据存储与显示逻辑彻底分离。这种设计带来的最大优势是:同一个数据模型可以被多个不同的视图组件共享,而视图的修改也会自动同步到模型。
QTableView默认使用QStandardItemModel作为其数据模型,但这个内置模型在复杂业务场景下往往力不从心。当我们需要实现以下功能时,就必须自定义数据模型:
- 动态加载海量数据(百万行级别)
- 特殊单元格渲染(如进度条、图标组合)
- 非标准数据源对接(数据库、网络API)
- 自定义排序过滤逻辑
实际开发中,90%的表格性能问题都源于不当的数据模型实现。良好的自定义模型可以轻松处理10万行数据的流畅滚动,而糟糕的实现连1000行都会卡顿。
2. 自定义模型的核心实现步骤
2.1 继承QAbstractItemModel
所有自定义模型都必须继承自QAbstractItemModel或其子类。基础模型需要实现以下纯虚函数:
cpp复制class CustomModel : public QAbstractTableModel {
Q_OBJECT
public:
// 必须实现的三个核心函数
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) const override;
bool setData(const QModelIndex &index, const QVariant &value, int role) override;
Qt::ItemFlags flags(const QModelIndex &index) const override;
};
2.2 实现数据角色系统
Qt的数据模型采用"角色(role)"机制来区分数据的多种用途。最常见的角色包括:
- DisplayRole:
