模型-视图-控制器(MVC)

 

 

 

一、有个对于大数据集的可视化方法:模型-视图-控制器(MVC)

(1)       模型代表数据集,它对需要查看数据的获取以及任何存储的改变负责。每种类型的数据集都有自己的模型,但不管底层的数据集市什么样子,模型提供给视图的API都是相同的。

(2)       视图代表的是面向用户的那些数据。在同一时间,任何大数据集只有有限的部分是可见的,所以这个有限的部分就是视图所请求的那部分数据。

(3)       控制器是用户和视图之间的媒介,它把用户的操作转换为浏览或编辑数据的请求,这部分数据是根据需要由视图传送给模型的数据。

 

Qt提供的一种模型/视图结构,该模型和经典的MVC中的行为是完全相同的。Qt使用的不是控制器,而是使用了一种不同的抽象:委托,委托用于对项的如何显示和如何编辑提供精细控制。Qt对每种类型的视图都提供了默认的委托

二、解析

(1)QT的项视图类有:QListWidget,QTableWidget,QTreeWidget

(2)QT的视图有:QListView,QTableView,QTreeView

可以使用QStandardItemModel作为模型(即提供数据源)

(4)       QT的模型有:QSqlTableModel,QStringListModel,QDirModel..等





我们的系统有很多数据显示的需求,比如从数据库中把数据取出,然后以自己的方式显示在我们自己的应用程序的界面中。
在早期的Qt版本中,要实现这个功能,我们需要定义一个widget,然后在这个widget中保存一个数据对象,比如是个list,然后我们对这个list进行查找、插入等的操作,或者把修改的地方写回这个list,然后刷新widget进行显示。这个思路很简单,也很清晰,但是对于大型程序,这种设计就显得苍白无力。比如,在一个大型系统中,你的数据可能很大,如果全部存入一个widget的数据对象中,效率会很低,并且这样的设计也很难在widgets之间共享变量,也就是说,如果你要几个组件共享一个数据对象,要么你就要用getter函数公开这个数据对象,要么你就必须把这个数据对象放进不同的组件分别进行维护。
Smalltalk语言发明了一种崭新的实现,用来解决这个问题,这就是著名的MVC模型。对这个模型无需多言,简单来说,这是一个model-view-controller模型,即模型-视图-控制器。在MVC中,模型负责获取需要显示的数据,并且能够存储这些数据的修改。每种数据类型都有它自己对应的模型,但是这些模型提供一个相同的API,用于隐藏内部实现。视图用于将模型数据显示给用户。对于很大的数据,或许只显示一小部分,这样就能很好的提高性能。控制器是模型和视图之间的媒介,将用户的动作解析成对数据的操作,比如查找数据或者修改数据,然后转发给模型执行,最后再将模型中需要被显示的数据直接转发给视图进行显示。
对于Qt而言,它使用的是一个类似于MVC模型的model-view架构。其中,model就相当于MVC架构中的model,而对于控制器部分,Qt使用的是另外的一种抽象,代理delegate。代理被用来提供对item渲染和编辑的控制。对于每种视图,Qt都提供了一个默认的代理,对于大多数应用来说,我们只需要使用这个默认的代理即可。这其中的类关系如下图所示(出自C++ GUI Programming with Qt 4, 2ndEdition)

使用 Qt model-view 架构,我们可以让 model 是取回 view 所要展示的数据,这样就可以在不降低性能的情形下处理大量数据。并且你可以 把一个 model 注册给多个 view ,让这些 view 能够显示同样的数据,也就是为同一个数据提供不同的显示方式。 Qt 会自动地对这些 view 保持同步, 自动刷新所有的 view 以显示最新的数据。这样,我们就可以只对 model 进行修改, view 会自动更新。
在很多情况下,只需要把一小部分的项呈现给用户,这就没必要使用 model 这样重量级的组件。 Qt 为了方便起见也提供了一些方便的项视图类,分别是 QListWidget QTableWidget QTreeWidget ,使用这些类可以直接对 item 进行操作。这种实现很像 Qt 早期版本,组件中包含了相应的 item ,例如 QTableWidget 中包含有 QTableWidgetItem 等。但是对于很大的数据,我们则需要使用 Qt view 类,比如 QListView QTabelView QTreeView ,同时需要提供一个 model ,可以是自定义 model ,也可以是 Qt 预置的 model 。例如,如果数据来自数据库,那么你可以使用 QTabelView QSqlTableModel 这两个类。
接下来我们会慢慢介绍这些类和其使用方法。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值