Qt - 模型视图

模型/视图

概念

模型/视图结构将数据存储和界面展示分离,分别用不同的类实现

  • 模型:存储数据
  • 视图:界面上的视图组件显示模型中的数据;在视图组件里修改的数据会被自动保存在模型中

请添加图片描述

  • 源数据

内存中的一个字符串列表
磁盘文件系统结构
数据库的一个数据表
sql查询结果

  • 视图(视图组件)

视图从模型获得数据然后将其显示在界面上 QListView QTreeView QTableView

  • 模型(数据模型)

模型与源数据通信,并为视图自检提供数据接口
模型从源数据提取需要的数据,用于视图组件进行显示和编辑
模型类 QStringListModel字符串列表模型类 QSqlTableModel数据库中数据表的模型类

  • 代理

在视图与模型之间交互操作时提供的临时编辑器
模型向视图提供数据是单向的,一般仅用于显示,当需要在视图上编辑数据时,代理会为编辑数据提供一个编辑器,这个编辑器获取模型的数据、接受用户编辑的数据后又将其提交给模型
(QTableView组件上双击一个单元格来编辑数据时,在单元格里就会出现一个QLineEdit组件,这个编辑框就是代理提供的临时编辑器)

  • 通讯方式

模型、视图、代理使用信号和槽进行通信
当源数据发生变化时,模型发射信号通知视图组件
当用户在界面上操作数据时,视图组件发射信号表示操作信息
在编辑数据时,代理会发射信号告知模型和视图组件编辑器的状态

模型

模型数据来源:

  • 内存数据(字符串列表等)
  • 二维表格型数据
  • 数据库中的数据表
    其他类、文件、数据库或任何数据源

一种模型数据可以用不同的视图组件来显示数据
界面与原始数据的交互是通过模型来完成的

QAbstractItemModel

所有基于项的模型类都是继承自QAbstractItemModel类
这个类定义了视图组件和代理存取数据的接口
模型只是在内存中临时存储数据
该抽象模型类不能直接用于创建实例对象,常用的模型类如下

// 继承关系
QAbstractItemModel
- QFileSystemModel                          // 用于表示计算机文件系统的模型类
- QAbstractListModel - QStringListModel     // 用于表示字符串列表数据的模型类
- QStandardItemModel                        // 标准的基于项的模型类,每个项是一个QStandardItem对象 
- QAbstractTableModel 
    - QSqlQueryModel                        // 用于表述数据库sql查询结果 
    - QSqlTableModel                        // 用于表述数据库的一个数据表的模型类

视图

  • QListView 用于显示单列的列表数据,一维数据
  • QTreeView 用于显示树状结构数据,树状结构数据
  • QTableView 用于显示表格数据,二维表格数据
  • QColumnView 用于多个QListView 显示树状结构数据
  • QUndoView …

xxxView / xxxWidget

xxxView 用于模型/视图结构,每一种视图组件需要相应的一种模型用于存储数据
xxxWidget是xxxView的子类,直接使用item来存储数据,称为视图类的便利类

视图组件的数据来源于模型
视图组件不存储模型
便利类为组件的每个节点或单元格创建一个项,用项存储数据 (QTableWidget这个便利类,表格的每个单元格关联一个QTableWidgetItem对象)
便利类没有模型,实际上是用项的方式代替模型的功能,将界面与数据进行绑定

便利类缺乏对大型数据源进行灵活处理的能力,只适用于小型数据的显示和编辑
视图组件则会根据模型的数据内容自动显示,有助于减少编程工作量,使用更灵活

// 继承关系
QAbstractItemView
- QListView
    - QUndoView 
    - QListWidget
- QTreeView
    - QTreeWidget
- QTableView
    - QTableWidget
- QColumnView

视图与模型

调用视图类的setModel()函数为视图组件设置一个模型,模型的数据就可以显示在视图组件上了
在视图组件上修改数据后,数据可以自动保存到模型中

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值