背景
Qt 中的模型视图架构是用来实现大量数据的存储、处理及其显示的,主要原理是将数据的存储与显示分离:模型定义了标准接口对数据进行访问;视图通过标准接口获取数据并定义显示方式;模型使用信号与槽机制通知视图数据变化。
QModelIndex 是实现数据的表示与数据的获取相分离的关键机制,模型中的数据约定使用唯一的索引来访问。
Qt::ItemDataRole 为数据项参数的索引,为数据项在不同情况下的数据进行标记,在获取数据项的数据时必须指定项角色。
抽象数据模型
Qt 提供了 3 类抽象数据模型:
①.QAbstractItemModel:项模型,所有数据模型的基类,可用于构建复杂的数据模型;
②.QAbstractListModel:列表模型;
③.QAbstractTableModel:表格模型。
要实现自定义的数据模型,可根据需求继承对应的抽象类,并重新实现需要的虚函数即可。
自定义数据模型
①.概念
视图通过模型定义的接口进行数据显示,因此一个数据模型至少需要提供以下接口:
一是数据的大小,即显示几行几列;二是数据的显示,即每个单元格要显示的内容。
②.要实现的虚函数
自定义一个数据模型,至少要实现以下虚函数:
rowCount:行数,返回要显示多少行;
columnCount:列数,返回要显示多少列
data:读取数据,返回每个单元格要显示的内容
只读数据模型
以 QAbstractTableModel 为例实现一个自定义数据模型,代码如下:
①.TableModelDemo.h 文件
class TableModelDemo : public QAbstractTableModel
{
Q_OBJECT
public:
TableModelDemo(QObject *parent = nullptr);
~TableModelDemo();
protected:
virtual int rowCount(const QModelIndex &parent) const override;//
virtual int columnCount(const QModelIndex &parent) const override;//
virtual QVariant data(const QModelIndex &index,int role) const override;//
};
②.TableModelDemo.cpp 文件
int TableModelDemo::rowCount(const QModelIndex &parent) const
{
return 2;
}
int TableModelDemo::columnCount(const QModelIndex &parent) const
{
return 2;
}
QVariant TableModelDemo::data(const QModelIndex &index, int role) const
{
switch (role)
{
case Qt::DisplayRole:
return QString("%1-%2").arg(index.row()).arg(index.column());
break;
default:
return QVariant();
break;
}
}
③.使用自定义模型
auto mode = new TableModelDemo();
ui.tableView->setModel(mode);