上一篇文章对Qt MVC框架下的模型类进行大致介绍,本文基于QAbstractItemModel来开发第一个用户模型类,重点关注各个接口的实现。
QAbstractItemModel
用户类需要集成基类QAbstractItemModel来开发自己的数据模型,一种方法就是按照之前的方式新建一个CPP类,基类选择QAbstractItemModel,然后在代码之中依次对每个需要实现的函数进行重载定义和实现;不过这样做会比较麻烦,而且由于模型虚方法很多,容易出错和遗漏。Qt开发器提供了更好的方法帮助用户快速开发自己的数据模型。
如下,右键项目选择新建,选择Qt大类中的Qt Item Model:
输入自己需要定义的类名称如CustomItemModel,基类有三个可以选择,此处选择QAbstractItemModel,下面的属性都勾上。当然这些属性可以根据具体的需要选择是否勾选。
点击下一步新建,即可生成用户模型类的头文件和源文件,此时Qt会创建好所有需要定义实现的重载函数,头文件代码如下:
#ifndef CUSTOMITEMMODEL_H
#define CUSTOMITEMMODEL_H
#include <QAbstractItemModel>
class CustomItemModel : public QAbstractItemModel
{
Q_OBJECT
public:
explicit CustomItemModel(QObject *parent = nullptr);
// Header:
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole) override;
// Basic functionality:
QModelIndex index(int row, int column,
const QModelIndex &parent = QModelIndex()) const override;
QModelIndex parent(const QModelIndex &index) const override;
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
int columnCount(const QModelIndex &parent = QModelIndex()) const override;
// Fetch data dynamically:
bool hasChildren(const QModelIndex &parent = QModelIndex(