qt中model/view介绍

model/view框架

简介:
1、model/view框架是为了显示、查看、编辑数据的。
2、model/view框架中数据的显示与存储部分是分离的。从面向对象的角度来解释该语句:显示是一个对象,存储是另一个对象,二者外部分离,但内部又相互作用,共同完成显示、查看、编辑等功能。
3、显示与存储分离的好处:复用性强,灵活性高。

使用场景:常在含有用户界面的程序中使用该框架


框架分析之QModelIndex索引

  • model是用来存储数据的,view是用来显示数据的,二者是通过QModelIndex索引来建立联系。
class Q_CORE_EXPORT QModelIndex
{
    friend class QAbstractItemModel;
    ...
    int r;  // model中某个子数据项的行数(row)
    int c;  // model中某个子数据项的列数(column)  
    quintptr i;  // model中某个父数据项的id(用于tree model)
    const QAbstractItemModel *m;  // 记录模型,便于访问数据
    inline QModelIndex parent() const;  // 记录该父索引
};

QModelIndex成员变量分析:
上述的int r; int c; quintptr i; 等表示的是model中数据的索引,但这个索引只是逻辑上的。model数据实际存放的方式可以是排列在ram中,也可以是在外部存储文件中,存储方式不确定,所以上述的索引只是一个相对的逻辑查找方式。这个逻辑实现是由编程者根据view的形式来实现的。


框架分析之QAbstractItemModel

  • QAbstractItemModel是一个model/view框架中的model抽象类,此类做了一些必要的接口。
class Q_CORE_EXPORT QAbstractItemModel : public QObject
{
    friend class QPersistentModelIndexData;
    friend class QAbstractItemViewPrivate;
    friend class QIdentityProxyModel;
    ...
    virtual QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const = 0;
    
    virtual QModelIndex parent(const QModelIndex &child) const = 0;

    virtual int rowCount(const QModelIndex &parent = QModelIndex()) const = 0;
    
    virtual int columnCount(const QModelIndex &parent = QModelIndex()) const = 0;
    
    virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const = 0;
};

上面类中有5个纯虚函数接口,子类实现这5个接口是model的必要条件。
1、index接口,QAbstractItemView中在显示数据前会调用index这个接口。在调用接口的过程中会提供row、column、parent参数,然后返回一个QModelIndex类型变量M,这个M是model类中createIndex接口产生的。createIndex的作用是把逻辑索引modelIndex与真实存储的数据建立联系。
2、parent接口,此接口通过给定一个子索引实现获取父索引。
3、rowCount接口,此接口通过给定一个父索引实现获取该索引下的子索引行数。
4、coloumn接口,此接口通过给定一个父索引实现获取该索引下的子索引列数。
5、data接口,此接口通过给定一个索引、一个角色实现获取该索引下对应角色的数据。QAbstractItemView中在显示数据时会调用data这个接口。

  • 后面还有QAbstractItemView没有介绍
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值