一、有个对于大数据集的可视化方法:模型-视图-控制器(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)
在很多情况下,只需要把一小部分的项呈现给用户,这就没必要使用 model 这样重量级的组件。 Qt 为了方便起见也提供了一些方便的项视图类,分别是 QListWidget , QTableWidget 和 QTreeWidget ,使用这些类可以直接对 item 进行操作。这种实现很像 Qt 早期版本,组件中包含了相应的 item ,例如 QTableWidget 中包含有 QTableWidgetItem 等。但是对于很大的数据,我们则需要使用 Qt 的 view 类,比如 QListView , QTabelView 和 QTreeView ,同时需要提供一个 model ,可以是自定义 model ,也可以是 Qt 预置的 model 。例如,如果数据来自数据库,那么你可以使用 QTabelView 和 QSqlTableModel 这两个类。
接下来我们会慢慢介绍这些类和其使用方法。