QT 模型/视图 编程 视图篇

视图类

  概念

  在模型/视图体系结构中,视图从模型中获取数据项并将它们呈现给用户。数据表示的方式不必与模型提供的数据表示类似,可能与用于存储数据项的底层数据结构完全不同。

  通过使用QAbstractItemModel提供的标准模型接口、QAbstractItemView提供的标准视图接口和以常规方式表示数据项的模型索引,可以实现内容和表示的分离。视图通常管理从模型中获得的数据的总体布局。它们可以呈现单独的数据项,或者使用委托来处理呈现和编辑特性。

  除了显示数据之外,视图还处理项之间的导航和项选择的某些方面。视图还实现了基本的用户界面功能,比如上下文菜单和拖放。视图可以为项提供默认的编辑功能,也可以与委托一起提供自定义编辑器。

  视图可以在没有模型的情况下构造,但是必须提供模型才能显示有用的信息。视图通过使用可分别为每个视图维护或在多个视图之间共享的选项来跟踪用户选择的项。

  有些视图,如QTableView和QTreeView,显示标题和项。这些也由视图类QHeaderView实现。header通常访问与包含它们的视图相同的模型。它们使用QAbstractItemModel::headerData()函数从模型中检索数据,并且通常以标签的形式显示标题信息。可以从QHeaderView类派生新的标头,以便为视图提供更多的专门化标签。

  使用一个已存在的视图类

  Qt提供了三个随时可用的视图类,它们以大多数用户熟悉的方式显示来自模型的数据。QListView可以将模型中的项显示为简单列表,也可以以传统图标视图的形式显示。QTreeView将模型中的项显示为列表的层次结构,允许以紧凑的方式表示深度嵌套的结构。QTableView将模型中的项以表格的形式呈现出来,很像电子表格应用程序的布局。

   上面显示的标准视图的默认行为对于大多数应用程序来说已经足够了。它们提供了基本的编辑功能,并且可以进行定制以满足更专门的用户界面的需要。

 使用一个模型

  我们将创建的字符串列表模型作为示例模型,用一些数据设置它,并构造一个视图来显示模型的内容。这些都可以在一个单一的功能:

注意,StringListModel声明为QAbstractItemModel。这允许我们使用模型的抽象接口,并确保代码仍然可以工作,即使我们用不同的模型替换字符串列表模型。

QListView提供的列表视图足以显示字符串列表模型中的项目。我们构造视图,并使用以下代码行建立模型:

视图以正常方式显示:

 视图呈现模型的内容,通过模型的接口访问数据。当用户尝试编辑一个项目时,视图使用一个默认的委托来提供一个编辑器小部件。

 上面的图像显示了QListView如何表示字符串列表模型中的数据。由于模型是可编辑的,因此视图自动允许使用默认委托编辑列表中的每个项。

使用模型的多个视图

在同一个模型上提供多个视图只是为每个视图设置相同的模型。在下面的代码中,我们创建了两个表视图,每个视图使用相同的简单表模型,我们已经创建了这个例子:

 模型/视图体系结构中信号和插槽的使用意味着对模型的更改可以传播到所有附加的视图,从而确保无论使用什么视图,我们都可以访问相同的数据。

 上面的图像显示了同一个模型上的两个不同视图,每个视图都包含一些选定的项。尽管来自模型的数据跨视图一致地显示,但是每个视图都维护自己的内部选择模型。这在某些情况下可能有用,但是对于许多应用程序来说,共享选择模型是可取的。

处理项目选择

  处理视图中项目选择的机制由QItemSelectionModel类提供。默认情况下,所有的标准视图都构建自己的选择模型,并以正常的方式与它们交互。视图使用的选择模型可以通过selectionModel()函数获得,可以使用setSelectionModel()指定替换选择模型。当我们希望在相同的模型数据上提供多个一致的视图时,控制视图所使用的选择模型的能力是很有用的。

  通常,除非您正在子类化一个模型或视图,否则您不需要直接操作选择的内容。但是,如果需要,可以访问选择模型的接口,这将在处理项目视图中的选择时进行探讨。

共享视图选择

  虽然视图类默认提供它们自己的选择模型很方便,但是当我们对同一个模型使用多个视图时,通常希望模型的数据和用户的选择在所有视图中一致地显示。由于视图类允许替换它们的内部选择模型,我们可以用以下代码实现视图之间的统一选择:

 第二个视图给出了第一个视图的选择模型。现在,两个视图都在相同的选择模型上操作,使数据和所选项目保持同步。

 在上面的例子中,使用了两个相同类型的视图来显示相同模型的数据。但是,如果使用了两种不同类型的视图,则在每个视图中所选的项可能表示得非常不同;例如,表视图中的连续选择可以表示为树视图中突出显示的片段项集。

原文地址:https://www.cnblogs.com/helloc14/p/12383526.html