实战PyQt5: 065-Model-View框架中的View类

视图(View)简介

在模型-视图框架中,视图从模型中获得数据项,并将其显示给用户。数据显示的方式不必与模型所提供的数据表示方法相同,可以与底层存储数据项的数据结构完全不同。内容与显示的分离是通过由QAbstractItemModel提供的标准模型接口,由QAsbstractItemview提供的标准视图接口和用来表示数据项的模型索引共同实现的。视图负责管理从模型中读取的数据的显示外观布局。

视图可以自己去渲染每个数据项,也可以利用委托来处理渲染和编辑。除了显示数据,视图也处理对数据项导航,参与有关于数据项选择的部分功能。视图也实现一些基本的用户接口特性,如上下文菜单与拖拽功能。视图为数据项提供了默认编程功能,但也可搭配委托以实现自定义的编辑器。

可以在没有模型的情况下构造视图,但是必须提供模型才能显示有用的信息。视图通过使用选择来跟踪用户选择的数据项,这些数据项可以由单个视图独立维护,也可以由多个视图共享。像QTableView和QTreeView这样的视图,除数据项之外也可显示标题(Headers),标题部分通过QHeaderView来实现。标题通常与包含它们的视图访问同一模型。他们使用QAbstractItemModel. headerData()函数从模型中检索数据,并且通常以标签形式显示标题信息。新标题需要子类化QHeaderView,以给视图提供更专业的标签。

使用视图类

Qt提供了三个现成的视图(View)类,能够以用户熟悉的方式显示模型中的数据。QListView能够以列表的形式将模型中的数据项显示,或是以经典的图标视图形式显示。QTreeView能够将模型中的数据项作为具有层次结构的列表的形式显示,允许以紧凑的深度嵌套的结构进行显示。QTableView能够架构模型中数据项以表格的形式展现,就像是一个电子表格应用程序的外观布局。

实战PyQt5: 065-MV框架中的View类

图片来源:doc.qt.io

以上这些标准视图的默认行为对于大多数应用程序应该足够了。它们提供了基本的编辑功能,可以满足定制更专业的用户界面的需求。

使用模型

我们以创建的字符串列表模型作为示例模型,使用一些数据对其进行设置,并创建一个视图以显示模型的内容,代码如下:

if __name__ == '__main__':
    app = QApplication(sys.argv)
    numbers = ['one', 'two', 'three', 'four', 'five', '6', '7', '8', '9', '10', '11', '12']
    model = QStringListModel(numbers)
    lv = QListView()
    lv.setModel(model)
    #设置窗口大小
    lv.resize(360, 200)
    #设置标题
    lv.setWindowTitle('实战PyQt5: Model-View框架演示')
    lv.show()
    sys.exit(app.exec())

视图会表示通过模型的接口来访问模型中的数据内容。当用户试图编辑数据项时,视图会使用默认委托来提供一个编辑组件。

实战PyQt5: 065-MV框架中的View类

 

上图显示QListView如何显示字符串列表模型的内容。由于模型是可编辑的,视图会自动允许列表中的每一项使用默认的委托编辑。

单个模型对应多个视图

为多个视图提供相同的模型的方法非常简单,只需为每个视图设置相同的模型即可实现。下面的代码创建了两个表格视图,每个视图使用相同的模型。

firstTableView = QTableView()
secondTableView = QTableView()
firstTableView.setModel(model)
secondTableView.setModel(model)

在模型-视图框架中,信号-槽机制的使用意味着模型中发生的改变会传递到所有与其连接的视图中,这就确保了不管使用哪个视图,访问的都是同一份数据。

实战PyQt5: 065-MV框架中的View类

图片来源:doc,.qt.io

上图展示了同一模型的两个不同视图,每个视图都包含一点数量的选中项。尽管在不同的视图中显示的模型中的数据是一致的,但每个视图都维护它们自己的内部选择模型,在某些情况下这会很有用。

处理数据项的选择

QItemSelectionModel类提供了用于处理视图中项目选择的机制。默认情况下,所有标准视图都构造自己的选择模型,并以常规方式与其交互。可以通过selectionModel()函数获得视图使用的选择模型,并可以使用setSelectionModel()指定替换选择模型。当我们要在同一模型数据上提供多个一致的视图时,控制视图使用的选择模型的功能非常有用。通常,除非要对模型或视图进行子类化,否则无需直接操纵选择内容。

在视图间共享选择

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

secondTableView.setSelecttionModel(firstTableView.selectionModel())

第二个视图设置了与第一个视图一样的选择模式。两个视图操作同样的选择模式,保持了数据与选中项的同步。

实战PyQt5: 065-MV框架中的View类

图片来源:doc.qt.io

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

本文知识点

  • Qt中的标准视图类;
  • 在视图中使用模型;
  • 单个模型对应多个视图;
  • 在视图中共享选择项;

前一篇: 实战PyQt5: 064-Model-View框架中的Model类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值