简述
在模型/视图框架中,视图展示数据的方式与模型表示数据的方式可能有所不同。
QAbstractItemModel与QAbstractItemView所提供的标准化接口让获取数据与表示数据表示相分离。视图可以自己渲染数据项目的显示,也可以使用代理来一起处理显示与编辑。
除了数据项目的显示,视图还负责数据项目之间的导航。视图实现了诸如文本按钮和拖拽等基本用户接口。
视图通过使用selections类来跟踪用户选择的项目,这些selections类可以为每个视图单独拥有,或者在多个视图之间共享。
一些视图,例如QTableView和QTreeView,会显示标题。标题由视图类QHeaderView实现。标题通常与包含它们的视图访问相同的模型。他们使用QAbstractItemModel :: headerData()函数从模型中检索数据,并且通常以标签形式显示标头信息。可以从QHeaderView类继承新的标头,为视图提供定制化的标签。
使用现成的视图
Qt提供了三种现成的视图类来以用户熟悉的方式展示模型中的数据。QListView可以以简单列表或者带图例列表的方式展示模型中的数据。QTreeView以层级结构来展示模型中的数据。QTableView以表格形式展示模型中的数据。

标准视图的默认接口已经能够满足绝大多数应用的需求。它们提供基础的编辑工具,并且可以被定制化满足一些特定用户的需求。
使用视图
下面使用QStringListModel来存储一些字符串,并用视图去展示它们,代码如下所示
QStringList numbers;
numbers << "One" << "Two" << "Three" << "Four" << "Five";
QAbstractItemModel *model = new QStringListModel(numbers);
使用QListView来展示字符串列表模型中的项目
QListView *view = new QListView;
view->setModel(model);
view->show();
效果如下所示

上面的图片展示了QListView是如何展示字符串模型中数据的。由于模型是可编辑的,因此视图自动允许使用默认代理来编辑列表中的每个项目。
一个模型上使用多个视图
为同一个模型提供多个视图只需要给每一个视图都设置相同的模型,如下所示:
QTableView *firstTableView = new QTableView;
QTableView *secondTableView = new QTableView;
firstTableView->setModel(model);
secondTableView->setModel(model);

信号槽的使用使得模型的数据变动会反映到所有与该模型相绑定的视图上,确保无论我们使用哪一个视图都可以获得相同的数据。
项目的选择
QItemSelectionModel提供了用于处理视图中项目选择的机制。默认情况下,所有标准视图都构建自己的选择模型,并以常规方式与其交互。可以通过selectionModel()函数获得视图使用的选择模型,并可以使用setSelectionModel()替换选择模型。当我们要在同一模型数据上提供多个一致的视图时,控制视图所使用的选择模型的能力非常有用。
提示
: 选择模型可以看做是视图中的一个选择状态监控器,它监控着视图中所有数据条目的选择状态,任何状态的变化都会被它记录,同时也可以编程选择特定的数据条目。
多个视图共享选择模型
尽管默认情况下视图类提供它们自己的选择模型很方便,但是当我们在同一个模型上使用多个视图时,通常希望在所有视图中都同时显示模型的数据和用户的选择。由于视图类允许替换其内部选择模型,因此我们可以使用以下行在视图之间实现统一选择:
secondTableView->setSelectionModel(firstTableView->selectionModel());
为第二个视图提供了第一个视图的选择模型。现在,两个视图都在相同的选择模型上运行,从而使数据和所选项目保持同步。效果如下:

上面采用了两种不同的视图,在用户进行选择的时候可能会有些许不同步,这是正常现象。如果采用完全相同的视图,两个视图的选择状态将会完全同步。
引用
[1] Qt助手