![编程改变生活:用PySide6/PyQt6创建GUI程序(进阶篇·微课视频版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/921/52841921/b_52841921.jpg)
2.1 模型/视图简介
在PySide6中,基于模型/视图的控件采用了数据与显示相分离的技术。这种技术起源于Smalltalk的设计模式——Model/View/Controller(MVC,模型/视图/控制器),一般应用在显示界面的程序中。与前者不同,PySide6主要采用了Model/View/Delegate(模型/视图/代理)框架,简称为Model/View框架。
2.1.1 Model/View/Delegate框架
在PySide6中,可以使用Model/View/Delegate框架技术来显示、处理不同类型的数据。Model/View/Delegate框架如图2-1所示。
![](https://epubservercos.yuewen.com/59022E/31397649907873106/epubprivate/OEBPS/Images/Figure-P53_94547.jpg?sign=1739280141-bbWVtJUYCdKjdlNPHJ7GAe04mb89WAaM-0-10ee4144a05ece4c56294b8389ab074e)
图2-1 Model/View/Delegate框架
在Model/View/Delegate框架中,使用数据模型(Model)从数据源(Data)中读、写数据,使用视图控件(View)显示数据模型中获取的数据。如果用户要编辑数据,则可以使用代理控件(Delegate)编辑或修改数据,并将修改后的数据传递给数据模型(Model),PySide6的视图控件提供了默认的代理控件,例如QTableView中提供了QLineEdit编辑框,所以Model/View/Delegate可以简写为Model/View框架。
在PySide6中,数据模型、视图控件、代理控件通过信号/槽机制进行通信。
2.1.2 数据模型Model
PySide6提供了多种类型的数据模型,如图2-2所示。
![](https://epubservercos.yuewen.com/59022E/31397649907873106/epubprivate/OEBPS/Images/Figure-P54_94560.jpg?sign=1739280141-44xXoKVbqoDt8oiiM2qIyYQL2VCblp1v-0-df9ff5472e55e168bc8e89cd3e230761)
图2-2 PySide6中的数据模型
在实际编程中会根据不同的功能选择不同类型的数据模型。PySide6提供的数据模型类的功能见表2-1。
表2-1 PySide6提供的数据模型类
![](https://epubservercos.yuewen.com/59022E/31397649907873106/epubprivate/OEBPS/Images/Figure-T54_133823.jpg?sign=1739280141-7u0d0H2FrCsziOTvAe4ZTJEAzf9q86w0-0-51276b042769c01b42cf874deb1a3783)
本章将重点讲述QAbstractItemModel、QStringListModel、QStandardItemModel、QFileSystemModel。
2.1.3 视图控件View
视图控件是用来显示数据模型的显示控件,PySide6提供了多种视图控件,如图2-3所示。
在实际编程中会根据不同的功能选择不同类型的视图控件。PySide6提供的视图控件类的功能见表2-2。
![](https://epubservercos.yuewen.com/59022E/31397649907873106/epubprivate/OEBPS/Images/Figure-P55_94625.jpg?sign=1739280141-CcXNA0Eli23sNRRRmhfELXp1obxOE75Q-0-9485105481e93c8ed417a7a11465c225)
图2-3 PySide6中的视图控件
表2-2 PySide6提供的视图控件类
![](https://epubservercos.yuewen.com/59022E/31397649907873106/epubprivate/OEBPS/Images/Figure-T55_133825.jpg?sign=1739280141-KvAg7HHw2SzvVSDWkawWMgyTrSCWVoOV-0-19fef28684e586b6d03fa4fdb1728360)
本章将重点介绍QListView、QTableView、QTreeView的应用。
2.1.4 代理控件Delegate
代理控件就是视图控件上为编辑数据提供的临时编辑器。例如当在QTableView控件上编辑一个单元格的数据时,默认提供一个QLineEdit编辑框。代理控件负责从数据模型获取相应的数据,并显示在编辑器里,修改数据后可以将数据保存到数据模型中。
在PySide6中,QAbstractItemDelegate类是所有代理控件类的基类,是一个抽象类,不能直接使用。其子类QStyledItemDelegate类是PySide6中视图控件类的默认代理控件类,默认提供QLineEdit类作为编辑器。如果开发者使用QComboBox、QSpinBox作为代理控件,则要继承QStyledItemDelegate类创建自定义代理控件类。
2.1.5 数据项索引QModelIndex
在数据模型Model中,数据存储的基本单元为item,每个item都对应了唯一的索引值(QModelIndex)。
在PySide6中,使用QModelIndex类表示数据索引,每个数据索引都有3个属性,分别为行、列、父索引。对于一维数据模型只会用到行,例如列表;对于二维数据模型会用到行和列,例如Table;对于三维数据模型会用到行、列、父索引,例如树。这3种数据如图2-4所示。
![](https://epubservercos.yuewen.com/59022E/31397649907873106/epubprivate/OEBPS/Images/Figure-P56_94672.jpg?sign=1739280141-rKEVWHFQ6Z6DXUFUGr2dc70beIGBAVHJ-0-88b4d629b8430dbcc544b81889b2da42)
图2-4 不同的数据类型
在PySide6中,QModelIndex类的常用方法见表2-3。
表2-3 QModelIndex类的常用方法
![](https://epubservercos.yuewen.com/59022E/31397649907873106/epubprivate/OEBPS/Images/Figure-T56_133827.jpg?sign=1739280141-wXU7V6qzRFAoNTg6Jo9aQLOTo0gmNeGB-0-16106e0f237c87f288dd3a3bd8eff5cb)
2.1.6 抽象数据模型QAbstractItemModel
在PySide6中,QAbstractItemModel类为其他数据模型类的基类,该类提供了数据模型与视图控件的数据接口。QAbstractItemModel类是抽象类,不能直接使用。QAbstractItemModel类的方法被其子类继承。
QAbstractItemModel类的常用方法见表2-4。
表2-4 QAbstractItemModel类的常用方法
![](https://epubservercos.yuewen.com/59022E/31397649907873106/epubprivate/OEBPS/Images/Figure-T56_133829.jpg?sign=1739280141-IXOA1qcj5zhQueNtw0ChFp6DVzjZqwp7-0-1b068253a2dcda3d96b20147d458a7af)
续表
![](https://epubservercos.yuewen.com/59022E/31397649907873106/epubprivate/OEBPS/Images/Figure-T58_133833.jpg?sign=1739280141-Y6PnQgKUQmW3NDXKawCtHcPApB9ZECt0-0-97e6b624bc446bc79ce894d7d3a9fa93)
在PySide6中,Qt.ItemDataRole的枚举值见表2-5。
表2-5 Qt.ItemDataRole的枚举值
![](https://epubservercos.yuewen.com/59022E/31397649907873106/epubprivate/OEBPS/Images/Figure-T58_133835.jpg?sign=1739280141-SyXY7L4JOcMtjU8BqrpABZlmrgOL2hDP-0-d292e4be8ae8f1a4656eb9e78ab797c8)
在PySide6中,QAbstractItemModel类的信号也会被其子类继承。QAbstractItemModel类的信号见表2-6。
表2-6 QAbstractItemModel类的信号
![](https://epubservercos.yuewen.com/59022E/31397649907873106/epubprivate/OEBPS/Images/Figure-T59_133837.jpg?sign=1739280141-5CKWjFPBJX2ir5MX1xu9XnzAWvCrQk6g-0-0a3fbadeb1fcd3c8d28c61c20b90eacc)
2.1.7 典型应用
前面介绍了模型/视图的基础知识,下面将通过例题来演示如何使用模型/视图来创建控件,并显示数据。
【实例2-1】 创建一个窗口,该窗口包含1个QListView视图控件,该视图控件将数据模型设置为QStringListModel,代码如下:
![](https://epubservercos.yuewen.com/59022E/31397649907873106/epubprivate/OEBPS/Images/Figure-P59_137484.jpg?sign=1739280141-kFt6TJQDlayj9a38ZgpmPbDjPaEuxUoE-0-9bb09524e8d9a8b9c2645aa990d24785)
运行结果如图2-5所示。
![](https://epubservercos.yuewen.com/59022E/31397649907873106/epubprivate/OEBPS/Images/Figure-P60_137495.jpg?sign=1739280141-RCVarKqxE7c1Td4y5rv2oDeHCTl8Ryyl-0-fcc8cb85fbf8e79af0e3709ee0161aef)
图2-5 代码demo1.py的运行结果
注意:与QListWidget、QTableWidget、QTreeWidget创建的控件相同,可以通过双击视图控件的文本来修改内容。