一.模型视图设计模式
A.模型视图设计模式
1.模型与视图相分离
2.模型对外提供标准接口存取数据(不关心数据如何显示)
3.视图自定义数据的显示方式(不关系数据如何组织存储)
模型视图模式的直观理解
模型视图的工作机制
1.当数据发生改变时--模型发出信号通知视图
2.当用户与视图进行交互时--视图发出信号提供交互信息
Qt中的模型类层次结构
QAbstractItemModel类为项模型类提供抽象接口.QAbstractItemModel类定义项模型必须使用的标准接口,以便能够与模型/视图体系结构中的其他组件进行互操作。它不应该直接实例化。相反,您应该将其子类化以创建新模型。QAbstractItemModel类是Model / View Classes之一,是Qt模型/视图框架的一部分。它可以用作QML中项视图元素的基础数据模型或Qt Widgets模块中的项视图类。如果您需要一个模型用于项目视图,例如QML的List View元素或C ++小部件QListView或QTableView,您应该考虑子类化QAbstractListModel或QAbstractTableModel而不是此类。底层数据模型作为表层次结构公开给视图和委托。如果不使用层次结构,则模型是行和列的简单表。每个项目都有一个由QModelIndex指定的唯一索引
Qt中视图类的层次结构
QAbstractItemView类是使用QAbstractItemModel的每个标准视图的基类。QAbstractItemView是一个抽象类,本身不能实例化。 它提供了一个标准接口,通过信号和插槽机制与模型进行互操作,使子类能够随着模型的变化保持最新。 此类为键盘和鼠标导航,视口滚动,项目编辑和选择提供标准支持。
模型视图编程示例
树状视图与模型的代码示例
Widget.cpp
#include "Widget.h"
#include <QDir>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
m_treeView.setParent(this);
m_treeView.move(10, 10);
m_treeView.resize(500, 300);
m_fsModel.setRootPath(QDir::currentPath());//当前路径下
m_treeView.setModel(&m_fsModel);//模型与视图的连接
m_treeView.setRootIndex(m_fsModel.index(QDir::currentPath()));
}
Widget::~Widget()
{
}
Widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QFileSystemModel>
#include <QTreeView>
class Widget : public QWidget
{
Q_OBJECT
QFileSystemModel m_fsModel;
QTreeView m_treeView;//树状视图
public:
Widget(QWidget *parent = 0);
~Widget();
};
#endif // WIDGET_H
运行的结构如图所示
B.模型视图设计模式
1.模型定义标准接口(成员函数)对数据进行访问
2.视图通过标准接口获取数据并定义显示方式
3.模型使用信号与槽的机制通知视图数据变化
4.模型中的数据都是以层次结构表示的
C.模型中的索引
1.模型索引时数据与视图分离的重要机制
2.模型中的数据使用唯一的索引来访问
3.QModelIndex是Qt中的模型索引类--包含具体数据的访问途径,包含一个指向模型的指针
索引中的行与列--线性模型可以使用(row,column)作为数据索引
模型中数据索引的通用方式--三元组(row,column,parent)
模型中数据索引的通用方式
D.Q:不同的视图如何显示同一个模型中的数据?
Qt中标准模型定义
数据角色的概念
1.模型中的数据在视图中的用途可能不同
2.模型必须为数据设置特定数据角色
3.数据角色用于提示视图数据的作用
4.数据角色是不同视图以统一风格显示数据的标准
Qt中的数据角色定义
数据角色的意义--定义了数据在特定系统下的标准用途,不同的视图可以通过相同标准显示数据
来源:https://blog.51cto.com/13475106/2430093