视图类
文档结构
概念
使用已有视图
使用一个模式
在同一个模式上使用多个视图
控制条目选择
在视图间共享选择
概念
在Model/View体系结构中,视图从模式中获取数据条目并且将它们呈现给用户。数据呈现的方式不必要类似于底层数据结构存储的方式。
内容和形式的分开是由于使用了标准的由QAbstractItemModel提供的模式接口,QAbstractItemView提供的标准视图接口,和代表数据条目的模式索引的使用这样的通用方式。视图典型的用于管理从模式中获取到的数据的整体呈现。它们可能对每个数据条目分别修饰,或者代理来控制修饰和编辑特性。
除了呈现数据外,视图还控制条目间的导航,和条目选择的一些方面。视图也实现基本用户接口特性,如上下面菜单和拖放。视图可以为条目提供默认的编辑工具,或者它和代理一起工作来提供自定义编辑器。
视图可以不需要模式而被创建,但是要显示有用的信息必须提供一个模式。视图跟踪用户选择的条目,通过使用为各视图单独维护或多个视图贡献的选择。
有些视图,如QTableView和QTreeView,同时显示条目和头部。这些也被视图类QHeaderView实现。头部通常访问和包含它的视图的模式。它们从模式中重新得到数据使用函数QAbstractItemModel::headerData(),并且通常以标签的形式显示头部信息。新的头部类可以通过继承自类QHeaderView来为视图提供更多特殊的标签。
使用已有的视图
Qt提供了3各准使用的视图类,这些视图使用大部分用户熟悉的方式显示模式中的数据。QListView可以显示模式中的条目以简单列表的形式,或者经典的图标视图。QTreeView显示数据以一个继承关系的列表,允许深度嵌套的结构以一个紧凑的方式显示。QTableView显示模式中的条目以一个表格的形式,非常像一个电子表格。
![](https://p-blog.csdn.net/images/p_blog_csdn_net/turnerbook/1.png)
上面显示的标准视图的默认行为应该对应大部分应用都已经够用了。它们提供基本的编辑工具,并且可以被定制来满足特殊用户接口的需要。
使用一个模式
我们使用字符串列表模式,曾经当作例子创建的,给它配置一些数据,然后创建一个视图来显示模式的内容。这些可以在一个单一的函数中实现:
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();
}
视图对模式内容进行修饰,通过模式接口访问数据。当用户想要尝试编辑对象条目时,视图使用一个缺省的代理来提供一个编辑器工具。
![](https://p-blog.csdn.net/images/p_blog_csdn_net/turnerbook/2.png)
上面的图片显示
QListView
是怎样显示字符串列表模式中的数据的。这个模式是可编辑的,视图自动允许列表中的每个条目使用默认代理来编辑。
在同一个模式上使用多个视图
在同一个模式上使用多个视图,简单到为每个视图设置同一个模式。在下面的代码中,我们创建了两个表格视图,它们都使用相同的我们在这个例子中创建的表格视图:
QTableView * firstTableView = new QTabelView;
QTableView * secondTableView = new QTableView;
firstTableView->setModel( model );
sencondTableView->setModel( model );
在model/view体系结构中使用信号和槽意味着模式的改变可以被传播到所有依附的视图,保证我们可以总是访问相同的数据而不管视图正在使用。
![](https://p-blog.csdn.net/images/p_blog_csdn_net/turnerbook/3.png)
上面的图片显示在同一个模式上的两个不同的视图,每个包含一部分选择的对象。虽然模式中的数据和视图显示一致,但是每个视图维护着它自己的选择模式。这点在一些情况下很有用,但是对于很多应用程序,需要共享选择模式。
控制选择的条目
在视图间选择条目的控制机制是由类
QItemSelectionModel
提供的。所有的标准视图默认创建自己的选择模型,并且使用一般方式交换。视图使用的选择模式可以通过函数
selectionModel()
来获取,替换选择模式可以使用函数
setSelectionModel()
。当我们想要为同一个模式提供多个一致的视图时,视图控制选择模式的能力是非常重要的。
一般的,除非你继承了一个模式或视图,你不需要直接控制选择的内容。然而,选择模式的接口是可以访问的,如果需要,这些内容将在章节“在条目视图中控制选择”。
在视图间共享选择
虽然视图类提供了选择模式很方便,当我们在相同的模式上使用不止一个视图时,一般需要模式数据和用户选择在视图中保持一致。因为视图允许替换内部选择模式,我们可以使用下面的代码来达到视图间的一致:
secondTableView->setSelectionModel( firstTableView->selectionModel() );
第二个视图为第一个视图提供选择模式。两个视图现在操作相同的选择模式,保持两个选择的数据同步。
![](https://p-blog.csdn.net/images/p_blog_csdn_net/turnerbook/4.png)
在上面显示的例子中,使用两个相同类型的视图来显示相同的模式数据。然而,如果使用两个不同类型的视图,选择的模式可能在各视图中很不相同;例如,在一个表格中连续的选择会在一个树形视图中出现一段一段的高亮条目。
http://doc.trolltech.com/4.3/model-view-view.html#handling-selections-of-items