13.3 视图(Views)
在Qt的Model/View框架中,视图类在总体上负责绘制视图,处理用户的交互命令。对于含有较多数据项的视图,用户可以使用滚动条浏览到所有的数据项。对于具有树状层级结构的数据集,视图对象可以折叠/展开其中每个父节点。用户可以选择某个或者某些数据项,显示一个上下文相关的菜单或者进行拖曳操作。所有这些交互命令都由视图对象完成。
然而,视图类并不负责每个数据项的绘制以及编辑工作,这些工作将被"委托"给委托类,13.5节将讨论相关内容。每个视图对象被创建时,都会指向一个默认的委托对象。这个委托对象将负责绘制视图对象中的数据项。当用户需要编辑其中某个数据项时,这个委托对象会创建一个合适的编辑器,负责编辑目标数据项。编辑完成后,委托对象会将编辑结果写回模型的目标数据项中。由于这个默认委托对象的存在,程序员在使用一个视图对象时,可以不提供任何委托对象,方便了视图对象的使用。
Model/View框架提供了以下视图类。
(1)QAbstractItemView,是所有视图类的抽象基类。当Model/View框架中其他视图类无法满足我们的要求时,可以派生该类的子类。
(2)QListView、QTableView、QTreeView、QColumnView,分别以列表,表格,树,多极列表的形式显示模型中的数据集。13.2节已经讨论了前三种视图类的使用,本节将介绍QColumnView的使用。
(3)QHeaderView,和前面几个视图类不同,这个视图类只负责显示视图的标头部分。它调用模型类的headerData()函数,读取标头文字内容并将其显示在每列的上部或者每行的左侧。
对于具有树状层次结构的数据集,我们既可以像13.2.3节那样使用QTreeView来显示,也可以使用Model/View框架提供的另外一个视图类QColumnView来显示。QColumnView使用一个列表显示树中某个父节点的子节点。起始时,QColumnView对象只将树的最顶层节点显示在一个列表中。当用户单击其中一个节点时,视图对象在已有列表的右侧创建一个列表,显示被单击节点的所有子节点。依次类推,新列表不断被创建,其中第i个列表显示第i-1个列表中被单击节点的所有子节点。
例如,使用一个QColumnView对象显示本地文件系统的情形如图13 15所示。第一列显示驱动器名称(其中有些是使用Windows命令subst生成的虚拟驱动器),当用户选择"D:\"时,该驱动器下的目录、文件被显示在第二列。当用户选择其中的"Qt"时,该目录下的子目录被显示在第三列。当目录层次很深时,会创建很多个列表。当视图对象无法在整个窗口中显示所有列表时,会在窗口下方显示一个水平滚动条,以使用户能够浏览所有列表。
|
| 图13 15 用QColumnView对象显示本地文件系统 |
虽然看起来QColumnView的功能很强大,但是与其他视图类相似,它的使用方式却很简单,如代码段13 15所示。程序员并不需要告诉一个QColumnView对象需要显示多少个列表,它在运行时会查询模型对象。只要用户选择的数据项具有子节点,这个视图对象就会创建新的列表。
代码段13 15,用QColumnView对象显示本地文件系统,取自z:\examples\mvc\QColumnView_demo\main.cpp
- QFileSystemModel model;
- model.setRootPath("C:/");
- QColumnView *cview = new QColumnView;
- cview->setModel(&model);