lesson12-Model/View结构

简介: 一、model/view介绍 1、来源 Qt中的model/view结构由smalltalk公司的MVC结构发展而来。MVC有三种对象组成:model、view、contoller: model表示数据集,每种数据都有自己的数据模型,不管底层的数据集是什么样子,model提供给视图的API都是相同的 view视图是面向用户的那些数据。
一、model/view介绍
1、来源
Qt中的model/view结构由smalltalk公司的MVC结构发展而来。MVC有三种对象组成:model、view、contoller:
model表示数据集,每种数据都有自己的数据模型,不管底层的数据集是什么样子,model提供给视图的API都是相同的
view视图是面向用户的那些数据。同一时间,对于大数据集只有少量的数据对用户是可见的,而这部分可见的数据就是视图请求的。
controller是用户和视图之间的媒介,它把用户的操作转换为对数据的浏览或者编辑请求。

MVC的基本思路就是将数据的存储和表示分开分离。

2、Qt中的model/view
Qt中的model/view结构和MVC的基本思路一样,只是讲view和controller结合在一起。
model负责底层数据的存储,向上提供API。
view负责上层数据的显示,不同的视图可以呈现给不同的用户。

这种数据的存储和显示分离的方式,使得在不同的view上可以显示相同的数据,而改变view时对底层的数据没有影响
Qt中的model/view添加的代理delegate,model可以直接给view发送数据,或者经过delegate修改之后在发送给view。
将模型与视图分离之后,在处理大数据集的时候,可以提高效率;当底层数据存储方式改变之后,只需要修改model,而不需要许改view 


3、三个组件通信
在Qt的model/view中有3个组件,他们之间的通信采用信号和槽机制
model发出的信号通知view数据源发生了变化
view发出的信号提供了显示的数据项与用户交互的信息
delegate发出的信号用于在编辑时通知model和view当前的编辑状态

model为view和delegate提供了标准的接口来访问数据,这些接口在QAbstractItemModel中定义,这个类是所有model的基类;同理QAbstractItemView是所有view的基类。


 二、 使用model/view
1、Qt提供的model
QAbstractItemModel是所有model的基类,数据不需要存储在model中,可以存储在其他的地方。model为数据提供一个接口,它非常的灵活,对于不同的view基本满足要求

QAbstractItemModel下面又有子类QAbstractListModel、QAbstractTableModel、QStandardItemModel等等。如果要实现的model是基于list类型的数据结构那么你应该继承自QAbstractListModel,如果要实现的model是基于table类型的数据结构,那么你应该继承QAbstractTableModel。

Qt提供了一些可以直接使用的model:
QStringListModel存储简单的QString列表
QDirModel提供本地系统中的文件和目录信息
QStandardItemModel管理复杂的树形结构数据
QSqlQueryModel、QSqlTableModel用来访问数据库

Qt中还有3个经常使用的view:
QListView、QTreeView、QTableView

同一个model可以用不同的view显示出来
QDirModel model;
QListView list;
QTreeView tree;
QTableView table;
list.setModel(&model);
tree.setModel(&model);
table.setModel(&model);


 
2、model index
不管底层的数据如何显示,在model中Qt的数据会有以下3种显示方式


view使用index来访问model中的数据项,从来不用关心底层的数据如何存储。一个model可以作为一个简单的表来访问,数据项由行和列定位,同时还应该提供父项的索引:
QModelIndex index=model->index(row,col,parentIndex);
当提供的父项无效时,系统会默认为顶级父项

3、data
有了index,我们就可以通过data方法获取数据:
QVariant value = model->data(index, role);


4、role
model中的数据可以作为角色来使用,为不同的环境提供不同的数据。角色决定了数据如何在view中显示,角色在Qt中是一个枚举类型





三、实例

点击(此处)折叠或打开

  1. #include QApplication>
  2. #include QDirModel>
  3. #include QTreeView>
  4. #include QListView>
  5. #include QTableView>
  6. #include QSplitter>
  7. #include QtGui>

  8. int main(int argc, char *argv[])
  9. {
  10.     QApplication app(argc, argv);
  11.     
  12.     QStringList str;
  13.     str"11""22""33""44";

  14.     //model
  15.     QStringListModel *model = new QStringListModel(str);
  16.     //view
  17.     QListView list;
  18.     QTreeView tree;
  19.     QTableView table;

  20.     list.setModel(model);
  21.     table.setModel(model);
  22.     tree.setModel(model);

  23.     QSplitter *splitter = new QSplitter();
  24.     splitter->setOrientation(Qt::Vertical);
  25.     splitter->addWidget(&list);
  26.     splitter->addWidget(&table);
  27.     splitter->addWidget(&tree);
  28.     splitter->show();

  29.     QModelIndex ind = model->index(1,1);
  30.     QVariant value = model->data(ind, Qt::DisplayRole);
  31.     qDebug()value;

  32.     return app.exec();
  33. }








相关文章
|
Docker 容器 Python
项目介绍:InStock系统
InStock量化投资工具,支持多设备使用,提供数据获取、技术指标计算、K线形态识别、综合选股、策略验证与自动交易等功能,助力投资者高效决策。
项目介绍:InStock系统
|
11月前
|
人工智能 自然语言处理 语音技术
PodAgent:港中文、微软、小红书联合推出的播客生成框架
PodAgent 是由香港中文大学、微软和小红书联合推出的播客生成框架,基于多智能体协作系统,自动生成高质量对话内容,支持声音角色匹配和语音合成,适用于媒体、教育、企业推广等多个场景。
637 5
PodAgent:港中文、微软、小红书联合推出的播客生成框架
|
存储 人工智能 前端开发
AI 驱动的 WordPress(MEAP)(一)(4)
AI 驱动的 WordPress(MEAP)(一)
152 1
|
API Linux
【鸿蒙软件开发】ArkTS基础组件之TextTimer(文本显示计时)、TimePicker(时间选择)
【鸿蒙软件开发】ArkTS基础组件之TextTimer(文本显示计时)、TimePicker(时间选择)
1427 0
【鸿蒙软件开发】ArkTS基础组件之TextTimer(文本显示计时)、TimePicker(时间选择)
Echarts折线图的x和y轴坐标颜色修改
Echarts折线图的x和y轴坐标颜色修改
1239 1
|
SQL 安全 中间件
网站收到网络安全监督检查限期整改通知书
我们来看下网络安全监督检查限期整改通知书: 根据《中华人民共和国网络安全法》《中华人民共和国人民警察法》《中华人民共和国计算机信息系统安全保护条例》等法律法规规定,我单位于近日对你单位网络安全保护工作进行了监督检查,现将有关情况反馈如下:详见附件,根据《中华人民共和国网络安全法》《中华人民共和国计算机信息系统安全保护条例》《信息安全等级保护管理办法》《公安机关互联网安全监督检查规定》,请你单位于2022年1月18日前完成整改,并在期限届满前将整改情况函告我单位。
1539 0
网站收到网络安全监督检查限期整改通知书
|
存储 缓存 算法
PostgreSQL BTree索引的工程实践
PostgreSQL BTree索引的工程实践
C# WinForm中NotifyICon控件的用法
参考:http://blog.csdn.net/paullink520/article/details/14170021          http://www.cnblogs.com/webman/archive/2007/06/22/792849.html 【一】基本的知识 任务栏中的图标是一些进程的快捷方式,这些进程在计算机后台运行,如防病毒程序或音量控制。
3196 0