![编程改变生活:用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=1739270154-tmSpAO01Yd8cuw2oNiLHRLSzW4LPiuAM-0-b2b219246242e42a2d9d6fa2c2f3c5ab)
图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=1739270154-Nf1Lc7m1twr1EMNOPK8RB3xkAyntKTQh-0-151811e0b03fe4dac830269180935717)
图2-2 PySide6中的数据模型
在实际编程中会根据不同的功能选择不同类型的数据模型。PySide6提供的数据模型类的功能见表2-1。
表2-1 PySide6提供的数据模型类
![](https://epubservercos.yuewen.com/59022E/31397649907873106/epubprivate/OEBPS/Images/Figure-T54_133823.jpg?sign=1739270154-12betwvjR70A7cDIwbRZoPy8K9veuM2U-0-31ad41f4783870662e573bb2ac07be0d)
本章将重点讲述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=1739270154-JLWlCWue6SBXiZfvUBWxHmK0ExuhfE7H-0-59e473ff1bf35f2b86f21a2a7440d90e)
图2-3 PySide6中的视图控件
表2-2 PySide6提供的视图控件类
![](https://epubservercos.yuewen.com/59022E/31397649907873106/epubprivate/OEBPS/Images/Figure-T55_133825.jpg?sign=1739270154-4yXQ5W7ANIXy61bgm7sT38OQbcrPtDPh-0-3c447a8c995778c711bcd25b9d11772d)
本章将重点介绍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=1739270154-A1fFz6oC7vtQHVPIFop6PuHe61hB0bPs-0-b74ee5609a629b005b394fe838cb8b06)
图2-4 不同的数据类型
在PySide6中,QModelIndex类的常用方法见表2-3。
表2-3 QModelIndex类的常用方法
![](https://epubservercos.yuewen.com/59022E/31397649907873106/epubprivate/OEBPS/Images/Figure-T56_133827.jpg?sign=1739270154-f5165pmmhC1WNrnN5YB7kVHQsTpOrijf-0-9b996b915851cba191fb1271415c7a1c)
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=1739270154-01dTj4z2zl4fyomxIrulPoL2AqqjMlR2-0-f9c853f4dbc83554a6a068fdf33b21e9)
续表
![](https://epubservercos.yuewen.com/59022E/31397649907873106/epubprivate/OEBPS/Images/Figure-T58_133833.jpg?sign=1739270154-tUQ2Is3uJ6SGcGojOAIGlGHyO72mtA2D-0-8b27b804933bc54e31e97e6f083a686f)
在PySide6中,Qt.ItemDataRole的枚举值见表2-5。
表2-5 Qt.ItemDataRole的枚举值
![](https://epubservercos.yuewen.com/59022E/31397649907873106/epubprivate/OEBPS/Images/Figure-T58_133835.jpg?sign=1739270154-qQrDzLLoUIAq5xn41iHgCnei0z1zW4x7-0-591ab51cc56b3cc648184bdb8d30ea83)
在PySide6中,QAbstractItemModel类的信号也会被其子类继承。QAbstractItemModel类的信号见表2-6。
表2-6 QAbstractItemModel类的信号
![](https://epubservercos.yuewen.com/59022E/31397649907873106/epubprivate/OEBPS/Images/Figure-T59_133837.jpg?sign=1739270154-kwo1vldZob6kArh2WA6dRzWQwwRQjkEh-0-a985247e96018a4af39c824d1ec526a7)
2.1.7 典型应用
前面介绍了模型/视图的基础知识,下面将通过例题来演示如何使用模型/视图来创建控件,并显示数据。
【实例2-1】 创建一个窗口,该窗口包含1个QListView视图控件,该视图控件将数据模型设置为QStringListModel,代码如下:
![](https://epubservercos.yuewen.com/59022E/31397649907873106/epubprivate/OEBPS/Images/Figure-P59_137484.jpg?sign=1739270154-k3wfFlLqSlgbzpy6YmaIzfvp5iTtmrtR-0-89a69f77e4ffa90a58de5356176b1ae6)
运行结果如图2-5所示。
![](https://epubservercos.yuewen.com/59022E/31397649907873106/epubprivate/OEBPS/Images/Figure-P60_137495.jpg?sign=1739270154-gSKTOJctTC64VKBdOIW0r0gjFzL0Jjok-0-cc1ca19359f56447a115eaa9e8f88c04)
图2-5 代码demo1.py的运行结果
注意:与QListWidget、QTableWidget、QTreeWidget创建的控件相同,可以通过双击视图控件的文本来修改内容。