1.概述
MVC设计模式是起源于Smalltalk的一种与用户界面相关的设计模式,准确来说MVC是一种框架,QT中没有MVC,替代它的是模型/视图,通过使用此模型,可以有效地分离数据和用户界面。模型/视图分为三个部分
- 模型(Model)
模型与数据源通信,并为其他部件提供接口,
所有的模型都基于QAbstractItemModel类。这个类定义了一个使用视图和委托来访问数据的接口。数据本身不是必须要存储在模型中,可以在一个数据结构或一个单独的类、文件、数据库、或其它一些应用组件。
QAbstractItemModel为数据提供了一个接口,它足够的灵活性来处理表格、列表、树形式的数据视图。然而,实现新的列表和类似于表的数据结构模型时,QAbstractListModel和QAbstractTableModel类是更好的起点,因为它
们提供了适当的常用的功能的默认实现。这些类可以派生子类,用来提供支持特定种类的列表和表格的模型。
Qt提供了一些现成的模型,可以用来处理数据项:
- QStringListModel:用于存储简单的QString的列表项。
- QStandardItemModel:管理更复杂的树结构件,其中每一个项目可以包含任意数据。
- QFileSystemModel:提供有关本地文件系统的文件和目录信息。
- QSqlQueryModel、QSqlTableModel、QSqlRelationalTableModel:使用模型/视图约定来访问数据库。
继承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中)
模型/视图结构
模型/视图/委托通信
模型、视图、委托使用信号和槽相互通信:
- 模型的信号:通知视图关于改变由数据源保持的数据。
- 视图的信号:提供了关于用户交互显示的项目信息。
- 委托的信号:当编辑时告诉模型和视图编辑器的状态。