QT模型/视图简介 (一)

1.概述

  MVC设计模式是起源于Smalltalk的一种与用户界面相关的设计模式,准确来说MVC是一种框架,QT中没有MVC,替代它的是模型/视图,通过使用此模型,可以有效地分离数据和用户界面。模型/视图分为三个部分

  • 模型(Model)

    模型与数据源通信,并为其他部件提供接口,

         所有的模型都基于QAbstractItemModel类。这个类定义了一个使用视图和委托来访问数据的接口。数据本身不是必须要存储在模型中,可以在一个数据结构或一个单独的类、文件、数据库、或其它一些应用组件。
      QAbstractItemModel为数据提供了一个接口,它足够的灵活性来处理表格、列表、树形式的数据视图。然而,实现新的列表和类似于表的数据结构模型时,QAbstractListModel和QAbstractTableModel类是更好的起点,因为它
          们提供了适当的常用的功能的默认实现。这些类可以派生子类,用来提供支持特定种类的列表和表格的模型。
      Qt提供了一些现成的模型,可以用来处理数据项:
  • QStringListModel:用于存储简单的QString的列表项。
  • QStandardItemModel:管理更复杂的树结构件,其中每一个项目可以包含任意数据。
  • QFileSystemModel:提供有关本地文件系统的文件和目录信息。
  • QSqlQueryModel、QSqlTableModel、QSqlRelationalTableModel:使用模型/视图约定来访问数据库。
         如果这些标准模型不能满足要求,则可以继承化QAbstractItemModel、QAbstractListModel或QAbstractTableModel来创建自定义模型。
  继承QAbstractItemModel类代码
  
 1 class HistoryModel : public QAbstractItemModel
 2 {
 3 public:
 4     explicit HistoryModel(QObject *parent = 0);
 5 
 6     // 构造父节点下子节点的索引
 7     virtual QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override;
 8     // 通过子节点索引获取父节点索引
 9     virtual QModelIndex parent(const QModelIndex &child) const override;
10     // 获取父节点下子节点的行数
11     virtual int rowCount(const QModelIndex &parent = QModelIndex()) const override;
12     // 获取父节点下子节点列数
13     virtual int columnCount(const QModelIndex &parent = QModelIndex()) const override;
14     // 获取节点数据:包括DisplayRole|TextAlignmentRole等
15     virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
16 };
  • 视图 (View)

  视图从模型中获得用来引用数据条目的模型索引(Model Index),

  InterView框架中的所有视图都基于抽象基类QAbstractItemView类,此类由QColumnView、QHeaderView、QListView、QTableView和QTreeView类继承。

  • 代理(Delegate)

  代理负责绘制数据条目,当编辑条目时,代理和模型直接进行通信。

   InterView框架中的所有代理都基于抽象基类QAbstractItemDelegate类,此类由QItemDelegate 和 QStyledItemDelegate类继承。

  二者的区别在于绘制和向视图提供编辑器的方式。QStyledItemDelegate使用当前样式绘制,并且能够使用 Qt Style Sheet,因此我们推荐在自定义委托时,使用 QStyledItemDelegate作为基类。不过,除非自定义委托需要自己进
  行绘制,否则,二者的代码其实是一样的。

  继承 QStyledItemDelegate需要实现以下几个函数:

       · createEditor():返回一个组件。该组件会被作为用户编辑数据时所使用的编辑器,从模型中接受数据,返回用户修改的数据。(//创建你编辑时候的控件)
      · setEditorData():提供上述组件在显示时所需要的默认值。(//编辑的时候设置数据到上面创建的editor中)
      · updateEditorGeometry():确保上述组件作为编辑器时能够完整地显示出来。(//设置编辑控件的位置和大小。样式等)
      ·setModelData():返回给模型用户修改过的数据。(//编辑完成,保存数据到data中)

 模型/视图结构

         

模型/视图/委托通信
    模型、视图、委托使用信号和槽相互通信:
  • 模型的信号:通知视图关于改变由数据源保持的数据。
  • 视图的信号:提供了关于用户交互显示的项目信息。
  • 委托的信号:当编辑时告诉模型和视图编辑器的状态。

猜你喜欢

转载自www.cnblogs.com/xyb617/p/12629304.html