StupidBeauty
Read times:281Posted at:Sun Aug 15 14:33:21 2010 - no title specified

Qt4.6.2文档翻译:视图类

概念

在模型/视图架构中 ,视图从模型获得数据条目并且将它们展示给用户 。数据被显示的方式不需要与模型所提供的数据的表示的方式一致 ,而且可能与用来保存数据条目的底层数据结构 完全不同

内容与展示的分离是通过使用以下事物来实现的 :由 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());

第一个视图的选择模型被传递给了第二个视图 。现在两个视图都在同一个选择模型上操作 ,使得数据和选中的条目都保持同步

在上面展示的示例中 ,使用了两个相同种类的视图来显示同一个模型的数据 。然而 ,如果使用两个不同种类的视图 ,那么选中的条目在每个视图中的显示可能会非常不同 ;例如 ,一个表格视图中的连续的选择可能在一个树形视图中被显示成多个高亮的条目块组成的集合

Your opinions

Your name:Email:Website url:Opinion content:
- no title specified

HxLauncher: Launch Android applications by voice commands

 
Recent comments
2017年4月~2019年4月垃圾短信排行榜Posted at:Thu Sep 26 04:51:48 2024
Qt5.7文档翻译:QWebEngineCookieStore类,QWebEngineCookieStore ClassPosted at:Fri Aug 11 06:50:35 2023盲盒kill -9 18289 Grebe.20230517.211749.552.mp4