当前位置 博文首页 > Allen Roson:Qt View Classes

    Allen Roson:Qt View Classes

    作者:[db:作者] 时间:2021-07-09 09:39

    概念

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

    内容和表示的分离是通过使用QAbstractItemModel提供的标准模型接口、QAbstractItemView提供的标准视图接口以及以一般方式表示数据项的模型索引来实现的。视图通常管理从模型获得的数据的总体布局。它们可以自己呈现单个数据项,或者使用代理来处理呈现和编辑功能。

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

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

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

    使用现有视图

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

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


    使用模型
    我们以我们创建的字符串列表模型为例,使用一些数据对其进行设置,并构造一个视图来显示模型的内容。所有这些都可以在一个函数中执行:

     int main(int argc, char *argv[])
     {
          QApplication app(argc, argv);
    
      // Unindented for quoting purposes:
      QStringList numbers;
      numbers << "One" << "Two" << "Three" << "Four" << "Five";
    
      QAbstractItemModel *model = new StringListModel(numbers);

    ?

    请注意,StringListModel被声明为QAbstractItemModel。这允许我们使用模型的抽象接口,并确保代码仍然有效,即使我们用不同的模型替换字符串列表模型。
    QListView提供的列表视图足以表示字符串列表模型中的项。我们构建视图,并使用以下代码行设置模型:

    QListView *view = new QListView;
    view->setModel(model);

    视图以正常方式显示:

          view->show();
          return app.exec();
      }
    视图呈现模型的内容,通过模型的接口访问数据。当用户试图编辑一个项目时,视图使用一个默认委托来提供一个编辑器小部件。
    

    ?

    上图显示了QListView如何表示字符串列表模型中的数据。由于模型是可编辑的,因此视图自动允许使用默认代理编辑列表中的每个项。
    使用模型的多个视图
    在同一个模型上提供多个视图只需为每个视图设置相同的模型。在下面的代码中,我们创建了两个表视图,每个视图都使用我们为本例创建的相同的简单表模型:

      QTableView *firstTableView = new QTableView;
      QTableView *secondTableView = new QTableView;
    
      firstTableView->setModel(model);
      secondTableView->setModel(model);

    在模型/视图体系结构中使用信号和插槽意味着可以将模型的更改传播到所有附加视图,确保无论使用的视图如何,我们始终可以访问相同的数据。

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

    处理项目选择
    处理视图中项目选择的机制是由QItemSelectionModel类提供的。默认情况下,所有标准视图都会构建自己的选择模型,并以正常方式与它们交互。视图使用的选择模型可以通过selectionModel()函数获得,替换选择模型可以通过setSelectionModel()指定。当我们希望在同一个模型数据上提供多个一致的视图时,控制视图所使用的选择模型的能力非常有用。
    通常,除非您要对模型或视图进行子类化,否则不需要直接操作选择的内容。但是,如果需要,可以访问选择模型的接口,这将在处理项目视图中的选择时进行探讨。

    ?

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

     secondTableView->setSelectionModel(firstTableView->selectionModel());

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

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

    cs
    下一篇:没有了