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没有介绍

你可能感兴趣的:(嵌入式gui,嵌入式软件)