Smalltalk语言发明了一种崭新的实现,用来解决 这个问题,这就是著名的MVC模型。
对这个模型无需多言,简单来说,这是一个model-view-controller模型,即模型-视图-控
制器。在 MVC中,模型负责获取需要显示的数据,并且能够存储这些数据的修改。每种数据
类型都有它自己对应的模型,但是这些模型提供一个相同的API,用于隐藏内 部实现。视图
用于将模型数据显示给用户。对于很大的数据,或许只显示一小部分,这样就能很好的提高
性能。控制器是模型和视图之间的媒介,将用户的动作解析 成对数据的操作,比如查找数据
或者修改数据,然后转发给模型执行,最后再将模型中需要被显示的数据直接转发给视图进
行显示。
对于Qt而 言,它使用的是一个类似于MVC模型的model-view架构。其中,model就相
当于MVC 架构中的model,而对于控制器部分,Qt 使用的是另外的一种抽象,代理
delegate。代理被用来提供对item渲染和编辑的控制。对于每种视 图,Qt都提供了一个默认
的代理,对于大多数应用来说,我们只需要使用这个默认的代理即可。这其中的类关系如下
图所示(出自C++ GUI Programming with Qt 4, 2nd Edition)
使用Qt的 model-view架构,我们可以让model是取回view所要展示的数据,这样就
可以在不降低性能的情形下处理大量数据。并且你可以把一个 model注册给多个view,让这
些view能够显示同样的数据,也就是为同一个数据提供不同的显示方式。Qt会自动地对这些
view保持同步,自动刷 新所有的view以显示最新的数据。这样,我们就可以只对model进
行修改,view会自动更新。
在少量数据的情形下,我们不需要动 用model这样重量级的组件。Qt为了方便起见也提
供了item view类,分别是QListWidget,QTableWidget和QTreeWidget,使用这些类可以
直接对item 进行操作。这种实现很像 Qt 早期版本,组件中包含了相应的item,例如
QTableWidget中包含有QTableWidgetItem等。但是对于很大的数据,我们则需要 使用Qt的
view类,比如QListView,QTabelView和QTreeView,同时需要提供一个model,可以是自
定义model,也可 以是Qt 预置的model。例如,如果数据来自数据库,那么你可以使用
QTabelView和QSqlTableModel这两个类。